【问题标题】:DialogFragment findFragmentByTag return nullDialogFragment findFragmentByTag 返回 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;
    }

【问题讨论】:

    标签: android android-fragments android-webview android-dialogfragment


    【解决方案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(); 但是如何显示呢?
    • 最后,我选择隐藏对话框而不是存储它。
    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    相关资源
    最近更新 更多