【发布时间】: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