你應該避免在xml中關於onClick屬性的第一點。因爲如果您尊重屏幕旋轉等事件或使用多個對話框進行設置,那麼以這種方式處理對話框可能會非常痛苦。這導致大多數時間泄露的窗口錯誤,並且需要不必要的代碼開銷來避免這種情況。因爲你必須跟蹤自己實際顯示的對話框。 爲了能夠關閉對話框。這種方式,您可以使用您設置好的標籤,你叫dialogFragment.show(fragmentManager, "edit_task_list");
DialogFragment frag = (DialogFragment)getFragmentManager().findFragmentByTag("edit_task_list");
if(frag != null)
frag.dismiss();
正確的解決方案是使用一個接口作爲DialogFragment和活動之間的通信的回調。這使Dialog模塊化和代碼簡單。這是docs的一個例子。爲此,你不需要一個上下文。您只需將界面傳遞給onAttach()
回調中的對話框即可。它有一個Activity作爲參數的參考,該參數調用該對話框。
// Example interface for the communication
public interface OnArticleSelectedListener {
public void onButtonClicked(/*any Parameters*/);
}
public static class FragmentA extends DialogFragment {
OnArticleSelectedListener mListener;
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity; // get the interface of the Activity
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnArticleSelectedListener");
}
}
...
}
處理按鈕單擊對話框中並調用dismiss(),該對話框可以解除其自身。看看這個question爲什麼要用dismiss()代替getDialog()。dismiss()。
yourButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
if(mListener != null) // check if the listener is still valid
mListener.onButtonClicked(...); // calls the Activity implementation of this callback
dismiss(); // dismiss the Dialog
}
});
在對話框的onPause()
中,將接口的引用設置爲null。這樣,您可以確定只有在顯示對話框時纔會使用回調。
你的活動看起來是這樣的,以便能夠處理回調:
public class MyActivity extends Activity implements OnArticleSelectedListener{
...
@Override
public void onButtonClicked(...){
// your implementation here
}
}
我不知道你的整體設置,但如果你使用一個AlertDialog一個點擊按鈕時自動關閉對話框。該方法返回。
我想你應該使用接口和活動來實現它的方法。你可以傳遞所有有用的對象,甚至是對話對象。 – Aleksandr