Android DialogFragment 不会关闭

Posted

技术标签:

【中文标题】Android DialogFragment 不会关闭【英文标题】:Android DialogFragment doesn't dismiss 【发布时间】:2013-07-01 03:19:09 【问题描述】:

我在 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()关闭对话框;解雇允许状态损失();使用 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库中的错误吗?

【问题讨论】:

你确定 boton.setOnClickListener 被调用了吗? 是的,在 onClickListener 我放了一个 Log.d() 调用以确保 如果您尝试多次关闭它? dismiss 调用后,如果我再次单击该按钮会收到 nullPointerException,因为对话框内的 getView() 调用返回 null。第二次点击没有任何效果。 如果你打电话取消而不是解雇?有什么区别吗? 【参考方案1】:

我今天遇到了同样的问题。

您如何处理对话框中的视图?对我来说,问题是我有一个 FrameLayout,然后我将视图膨胀到其中(基于一些信息)。我不知道为什么这会破坏它,但确实如此。当我用一个简单的视图替换框架布局时,它工作得非常好。

希望一切顺利。祝你好运!

【讨论】:

我也有同样的情况..“viewstub”是什么意思? 使用(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) 而不是android.support.v4.app.DialogFragment.getLayoutInflater(Bundle) 似乎工作正常。凉爽的!在后者的 javadoc 中,cmets 中还有一个“@hide”,所以我相信它只是一个不能使用的函数。 奇怪,确实是 LayoutInflater 造成的!【参考方案2】:

嗯,不明白为什么这不起作用,但您始终可以将 getActivity().onBackPressed() 作为临时解决方法

【讨论】:

我知道,但我正在寻找的是解决方案或解释,我正在将对话框更改为片段以完成相同的结果,但我正在开发一个大型应用程序在 android 和这些东西让我很害怕。无论如何感谢您的回复。【参考方案3】:

从@zoltish 回答开始,我发现在创建实际视图后将视图膨胀到对话框内容中会产生这种麻烦。 在onCreate 中,我正在膨胀一个布局,然后使用一个帖子来调用一个 onViewCreated 工具,我在第一个布局中膨胀另一个布局。 解决方案是必须从onCreate 加载所有布局/视图层次结构,至少在 4.3 模拟器上。

【讨论】:

【参考方案4】:

将 Gianluca P. 的评论变成答案:

似乎使用错误的LayoutInflater 会破坏关闭功能。如果你得到一个 LayoutInflater 从 android.support.v4.app.DialogFragment.getLayoutInflater(Bundle) 然后用它来膨胀视图,dismiss 会被破坏。

要解决此问题,请改用(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)

只是其中之一。

【讨论】:

【参考方案5】:

我遇到了同样的问题,我将 DialogFragment 的引用移至对我有用的方法的本地范围。 (最初,这是我班级的领域)。

【讨论】:

【参考方案6】:

你为什么不尝试只使用这段代码:

dismiss();

如果您想自行关闭对话框片段。您可以简单地将这段代码放在要关闭对话框的对话框片段中。

例如:

button.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View v) 
        dismiss();
    
);

这将关闭屏幕上显示的最近的对话框片段。

希望对你有帮助。

【讨论】:

以上是关于Android DialogFragment 不会关闭的主要内容,如果未能解决你的问题,请参考以下文章

Android:DialogFragment.dismissInternal 处 DialogFragment.dismissAllow 处的 NullPointerException

按钮单击dialogFragment后如何在谷歌地图上添加标记?

Android 撸起袖子,自己封装 DialogFragment

Android 撸起袖子,自己封装 DialogFragment

Android中的全屏DialogFragment

主题不适用于 Android 上的 DialogFragment