本文出處:http://superonion.iteye.com/blog/1418467
我們知道,從一個Activity向另一個Activity傳遞數據,用Intent實現。而當一個浮在Activity之上的Dialog需要向該Activity傳遞數據時,應該怎么實現呢?接着上一篇文章:用Dialog創建帶箭頭的對話框。
現在PopupDialog中聲明一個內部接口PriorityListener,接口中聲明一個回調函數refreshPriorityUI,用於在Dialog的監聽事件觸發后刷新Activity的UI顯示。然后在MainActivity中的Button點擊事件中實現這個接口並將其作為PopupDialog的構造函數的參數傳入,並實現refreshPriorityUI()方法。話不多說,直接上代碼——
PopupDialog代碼:
- public class PopupDialog extends Dialog {
- /**
- * 自定義Dialog監聽器
- */
- public interface PriorityListener {
- /**
- * 回調函數,用於在Dialog的監聽事件觸發后刷新Activity的UI顯示
- */
- public void refreshPriorityUI(String string);
- }
- private PriorityListener listener;
- /**
- * 帶監聽器參數的構造函數
- */
- public PopupDialog(Context context, int theme, PriorityListener listener) {
- super(context, theme);
- this.listener = listener;
- }
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.popup_dialog);
- Button buttonUp = (Button) findViewById(R.id.btn_up);
- buttonUp.setOnClickListener(new Button.OnClickListener() {
- @Override
- public void onClick(View v) {
- dismiss();
- listener.refreshPriorityUI("數據來自:上");
- }
- });
- }
- }
MainActivity代碼:
- public class MainActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button button = (Button)findViewById(R.id.btn);
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- PopupDialog popupDialog = new PopupDialog(MainActivity.this, R.style.dialog, new PopupDialog.PriorityListener() {
- @Override
- public void refreshPriorityUI(String string) {
- Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();
- }
- });
- popupDialog.setCanceledOnTouchOutside(true); // 點擊Dialog之外的區域對話框消失
- Window window = popupDialog.getWindow();
- WindowManager.LayoutParams lp = window.getAttributes();
- lp.y = -64; // 設置豎直方向的偏移量
- lp.dimAmount = 0f; // 彈出對話框的時候背景不變暗
- popupDialog.show();
- }
- });
- }
- }
最后效果:
點擊“上”之后,MainActivity會調用refreshPriorityUI()方法: 

