应该避免关于 xml 中 onClick 属性的第一点。因为如果您尊重屏幕旋转或具有多个对话框的设置等事件,那么以这种方式处理对话框可能会非常痛苦。这在大多数情况下会导致泄漏的窗口错误,并且需要不必要的代码开销来避免这种情况。因为您必须跟踪实际显示的对话框。为了能够以这种方式关闭对话框,您可以使用您在调用时设置的标签dialogFragment.show(fragmentManager, "edit_task_list");
DialogFragment frag = (DialogFragment)getFragmentManager().findFragmentByTag("edit_task_list");
if(frag != null)
frag.dismiss();
正确的解决方案是使用接口作为 DialogFragment 和 Activity 之间通信的回调。这使 Dialog 模块化和代码简单。这是文档中的一个示例。为此,您不需要上下文。您只需将接口传递给onAttach()
回调中的对话框。它有一个 Activity 的引用作为参数,称为 Dialog。
// 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(),对话框可以自行关闭。看看这个问题为什么要使用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()
Dialog 中将接口的引用设置为 null。这样您就可以确保只有在显示对话框时才会使用回调。
您的 Activity 看起来像这样能够处理回调:
public class MyActivity extends Activity implements OnArticleSelectedListener{
...
@Override
public void onButtonClicked(...){
// your implementation here
}
}
我不知道您的整体设置,但是如果您要使用 AlertDialog,则单击按钮会在方法返回时自动关闭对话框。