【问题标题】:Does opening an activity from a dialog fragment dismisses the dialog fragment?从对话框片段打开活动是否会关闭对话框片段?
【发布时间】:2015-06-29 23:36:42
【问题描述】:

我有一个继承自 dialogfragment 的类:

import org.xwalk.core.*;
// ...

public class WebViewDialogFragment extends DialogFragment {
    private XWalkView webView;
    public static final String LOG_TAG = "WebViewDialogFragment";
    
    private String url;
    private WebViewJavascriptInterface javaScriptInterface;
    
    // The constructor I use to set the url.
    public WebViewDialogFragment(String url, WebViewJavascriptInterface javascriptInterface) {
        this.url = url;
    }

    public WebViewDialogFragment() {
        Log.d(LOG_TAG, "WebViewDialogFragment empty constructor was called.");
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(LOG_TAG, "Setting fullscreen mode");
        setStyle(DialogFragment.STYLE_NORMAL, R.style.SagoBizWebViewFullScreenTheme);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(LOG_TAG, "Setting Xwalkview");
        webView = new XWalkView(getActivity(), getActivity());
        webView.clearCache(true);
        Log.d(LOG_TAG, "Loading the url: " + url);
        webView.load(url, null);
        return webView;
    }
    
    @Override 
    public void onStart() {
        super.onStart();
        
        Dialog dialog = getDialog();
        if (dialog != null) {
            int width = ViewGroup.LayoutParams.MATCH_PARENT;
            int height = ViewGroup.LayoutParams.MATCH_PARENT;
            dialog.getWindow().setLayout(width, height);
        }
    }
    
    @Override
    public void onPause() {
        super.onPause();
        if (webView != null) {
            webView.pauseTimers();
            webView.onHide();
        }
    }   
    
    @Override
    public void onResume() {
        super.onResume();
        if (webView != null) {
            webView.resumeTimers();
            webView.onShow();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (webView != null) {
            webView.onDestroy();
        }
    }
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (webView != null) {
            webView.onActivityResult(requestCode, resultCode, data);
        }
    }
}

我还有另一个类有一个 WebViewDialogFragment 类型的成员:

public class WebView {
    protected static final String DIALOG_FRAGMENT_TAG = "WebViewDialogFragment";
    
    protected Activity activity;
    protected String dialogFragmentTag = DIALOG_FRAGMENT_TAG;   
    protected WebViewDialogFragment webViewDialogFragment;
        
    public WebView(Activity activity) {
        this.activity = activity;
    }

    public void display(final String url) {
        Log.d("TEST", "WebView display");
        
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                webViewDialogFragment = new WebViewDialogFragment(url, getWebViewJavascriptInterface());
                
                if (webViewDialogFragment != null) {
                    FragmentManager fm;
                    fm = activity.getFragmentManager();
                    Log.d("TEST", "Showing webview");
                    webViewDialogFragment.show(fm, WebView.this.dialogFragmentTag);
                } else {
                    Log.e("TEST", "webViewDialogFragment is null");
                }
            }
        });
    }

}

我调用 webview 的 display(String url) 方法来显示将要显示 webview 的对话框。

使用@javascriptinterface 属性,我在 webview javascript 和本机 java 之间建立了一座桥梁,以便我可以从对话框片段中打开外部浏览器(或存储)。 javascript接口有这样一个方法:

@JavascriptInterface
public void urlExternalAction(string url) {
    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    webView.activity.startActivity(browserIntent);
}

问题是,在打开外部活动(从对话框片段)后,当您回到我的应用程序(通过按后退按钮或通过任务切换)时,应用程序崩溃:

AndroidRuntime java.lang.RuntimeException:无法启动活动 ComponentInfo{com.myapp.Test/com.myapp.testActivity}:

android.app.Fragment$InstantiationException:无法实例化片段 com.myapp.Test.WebViewDialogFragment:确保类名存在、是公共的,并且有一个公共的空构造函数

我通过向 webviewdialogfragment 添加一个空的构造函数来解决崩溃问题,但这不是我想要的。我想要一个保留其状态的对话片段。

您能帮我修改代码以解决问题吗?

请注意,父活动的 onCreate 不在我的控制范围内,我不想修改它。

谢谢您,我期待您的意见。如果某个部分需要更好的解释,请告诉我。

【问题讨论】:

    标签: android android-dialogfragment crosswalk-runtime


    【解决方案1】:

    片段和活动需要一个空的构造函数,如果提供的话,它必须是唯一的构造函数。如果要使用一些数据初始化片段,则必须在将片段添加到片段管理器之前创建片段并使用 setArguments 方法。看看这个question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-09
      • 2014-10-21
      • 1970-01-01
      • 2019-02-26
      • 2022-01-21
      • 2018-03-04
      • 1970-01-01
      • 2013-07-31
      相关资源
      最近更新 更多