DialogFragment findFragmentByTag 返回 null

Posted

技术标签:

【中文标题】DialogFragment findFragmentByTag 返回 null【英文标题】:DialogFragment findFragmentByTag return null 【发布时间】:2017-12-22 19:18:50 【问题描述】:

我使用DialogFragment 包含一个webview。显示DialogFragment 后,当按下返回按钮时,应用程序将返回活动视图。如果按下显示 DialogFragment 按钮,webview 将再次加载 init url。但我的要求是,如果第二次打开 DialogFragment ,我希望上次加载 webview 显示页面。我怎样才能做到这一点?

我目前的想法是保留 DialogFragment 实例,当按下显示按钮然后检查活动是否已经有 DialogFragment。但是在我的代码中,findFragmentByTag 总是返回 null ,有什么问题?还是我应该在 DialogFragment 中做一些工作?

主要活动代码:

mcWebViewDialog m_webviewDialog = null;

public void showWebviewDialog()


    FragmentManager fragmentManager=getFragmentManager();
    FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
    Fragment prev=fragmentManager.findFragmentByTag("mcWebDialog");

    if(prev!=null)
    
        Log.v("seayoung","m_webviewDialog not null");
        fragmentTransaction.show(prev);
    
    else
    
        Log.v("seayoung","m_webviewDialog null");
        m_webviewDialog=mcWebViewDialog.newInstance();
        m_webviewDialog.set_loadurl("file:///android_asset/input.html");
        m_webviewDialog.show(fragmentManager,"mcWebDialog");
    

WebViewDialog 代码:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    

         //other code 
         m_webView.loadUrl(m_loadurl);

        return m_webView;
    

【问题讨论】:

【参考方案1】:

当您按下时,您的对话框片段被破坏并从后台堆栈中删除,因此您在执行findFragmentByTag 时得到空值,那么当用户按下时保持视图不是一个好主意,但作为替代方案您可以尝试在本地缓存创建的片段,像这样。

HashMap<String,WeakReference<DialogFragment>> dialogMap = new HashMap<>();

// call this before callin `show`
dialogMap.put(TAG,new WeakReference<>(YOUR_FRAGMENT));

下一次,你可以这样做

DialogFragment prev=fragmentManager.findFragmentByTag("mcWebDialog");
if(prev == null)
     prev = dialogMap.get("mcWebDialog").get();

if(prev!=null)
   Log.v("seayoung","m_webviewDialog not null");
   fragmentTransaction.show(prev);

【讨论】:

prev = dialogMap.get("mcWebDialog").get(); 但是如何显示呢? 最后,我选择隐藏对话框而不是存储它。

以上是关于DialogFragment findFragmentByTag 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Dialogfragment 未清除

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

DialogFragment.getDialog 返回 null

为啥要使用 DialogFragment?

从 DialogFragment 回调片段

允许 DialogFragment 的外部触摸