我在Android中有一个自定义对话框,我在onCreateView方法上创建对话框视图。
public class FiltroDialog extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
当我尝试关闭对话框时,我在onClickListener调用的对话框中有一个方法
boton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG,"doDismiss");
FiltroDialog.this.dismiss();
}
});
我已经覆盖了对话框的几个onMethods,以查看对话框中发生了什么。
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView");
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "onAttach");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach");
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
Log.d(TAG,"onCancel");
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
Log.d(TAG,"onDismiss");
}
我尝试用dismiss()关闭对话框; dismissAllowingStateLoss();使用FragmentTransaction并且每次我都有相同的结果。
D/FiltroDialog(30492): doDismiss
D/FiltroDialog(30492): onStop
D/FiltroDialog(30492): onDestroyView
D/FiltroDialog(30492): onDetach
但是对话框没有从屏幕上消失,使用后退按钮,对话框正确消失,但是使用dismiss()或FragmentTransaction.remove方法我只能使用Stop,DestroyView,Detach但不能使用onDismiss()
当我再次单击该按钮时,只有这个显示在LogCat
中D/FiltroDialog(30492): doDismiss
我尝试了几种方法来解除对话。这是我用来显示活动对话框的代码(也是从片段中尝试过的)
FiltroDialog newFragment = FiltroDialog.newInstance();
newFragment.show(getSupportFragmentManager(), TAG_DLG_FILTROS);
以下是尝试从活动中关闭对话框的代码(也是从片段中尝试过,结果相同)
DialogFragment prev = (DialogFragment) getSupportFragmentManager().findFragmentByTag(TAG_DLG_FILTROS);
if (prev != null) {
prev.dismiss();
}
这是尝试从活动中关闭的另一种尝试(也从片段中尝试,同样的结果)
Fragment prev = getSupportFragmentManager().findFragmentByTag(TAG_DLG_FILTROS);
if (prev != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.remove(prev);
ft.commit();
}
这是另一个尝试从对话框中关闭尝试调用DialogFragment中对话框的cancel()方法。
boton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG,"doDismiss");
FiltroDialog.this.getDialog().cancel();
}
});
不会关闭对话框,也不会调用onDismiss,也不会调用Stop,DestroyView,Detach方法。
这是另一个尝试从对话框中关闭尝试调用DialogFragment中对话框的dismiss()方法。
boton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG,"doDismiss");
FiltroDialog.this.getDialog().dismiss();
}
});
不会关闭对话框,也不会调用onDismiss,也不会调用Stop,DestroyView,Detach方法。
我在应用程序中有一些对话框,从来没有遇到过这个问题,我不是完全是Android编程的新手,但我不知道我做错了什么?这是compat库中的一个错误?
答案 0 :(得分:4)
我今天遇到了同样的问题。
您如何处理对话框中的视图?对我来说问题是我有一个FrameLayout,然后我将视图膨胀到(基于一些信息)。我不知道为什么这会打破它,但确实如此。当我用一个简单的viewstub替换framelayout时,它工作得很好。
希望它成功。祝你好运!
答案 1 :(得分:0)
嗯,不明白为什么那不起作用,但你总是可以做getActivity()。onBackPressed()作为临时解决方法
答案 2 :(得分:0)
从@zoltish回答开始,我发现在创建实际视图后将视图扩展到对话框内容会产生这种麻烦。
在onCreate
我正在给布局充气,然后使用帖子来调用onViewCreated工具,在那里我在第一个布局内膨胀另一个布局。
解决方案是所有布局/视图层次结构必须已从onCreate
加载,至少在4.3模拟器上加载。
答案 3 :(得分:0)
将Gianluca P.的评论转化为答案:
似乎使用错误的LayoutInflater
可以打破解散功能。如果您从中获得LayoutInflater
android.support.v4.app.DialogFragment.getLayoutInflater(Bundle)
然后用它来夸大观点,解散就会被打破。
要解决此问题,请改用(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
。
只是其中一个Android内容。
答案 4 :(得分:0)
我遇到了同样的问题,我将DialogFragment的引用移到了方法的本地范围,这对我有用。 (最初,这是我班级的领域)。
答案 5 :(得分:0)
为什么不尝试仅使用以下代码:
dismiss();
如果要自行关闭对话框片段。您可以简单地将此代码放在要关闭该对话框的对话框片段中。
例如:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
这将关闭屏幕上显示的最新对话框片段。
希望对您有帮助。