DialogFragment findFragmentByTag返回null

时间:2017-07-18 05:12:52

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

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

我当前的想法是保持DialogFragment实例,当按下show按钮然后检查activity是否已经有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 个答案:

答案 0 :(得分:0)

当您按下对话框时,对话框片段被销毁并从后台堆栈中移除,因此在执行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);
}