我正在开发一个有 2 个活动的 Android 应用程序。在一项活动中,我有一个 webview(父),它使用 WebChromeClient 的 onCreateWindow 创建子 webview。在 web 代码方面,我存储了 window.open() 的引用,它导致 onCreateWindow 创建子 webview 并向其发送消息。
活动一:
mWebViewParent.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onCreateWindow(WebView webview, boolean isDialog, boolean isUserGesture, Message message) {
WebView.WebviewTransport transport = (WebView.WebviewTransport) message.obj;
childWebView = new WebView(mContext);
transport.setWebView(childWebView);
message.sendToTarget();
}
});
我从网络代码中获取消息以开始第二个活动并完成它。由于我只存储了来自 web 代码的窗口的一个引用,因此window.open()
我不会破坏 webview,而只是完成活动;
活动一:
private BroadcastReceiver secondActivityStarted = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Activity activity = ActivityStack.getActivity();
activity.setContentView(childWebView);
}
}
@JavascriptInterface
public void startActivity() {
IntentFilter filter = new IntentFilter("secondActivityStarted")
LocalBroadcastManager.getInstance(mContext).registerReceiver(secondActivityStarted, filter);
Intent intent = new Intent(mContext, SecondActivity.class);
mContext.startSecondActivity(intent);
}
@JavascriptInterface
public void finishActivity() {
Activity activity = ActivityStack.getActivity();
activity.finish();
ActivityStack.setActivity(null);
LocalBroadcastManager.getInstance(mContext).unregisterReceiver(secondActivityStarted);
}
活动二:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityStack.setActivity(this);
Intent actionIntent = new Intent("secondActivityStarted");
LocalBroadcastManager.getInstance(this).sendBroadcast(actionIntent);
}
第一次,第二个 Activity 中的子 webview 的键盘没有任何问题,但是一旦我完成了 Activity 并再次启动它,键盘需要很长时间才能显示出来,我在键盘上键入的内容不会出现在网络的文本字段中。
我试过的:
设置和清除子 webview 的焦点
window.open() 的链接使用以下方法丢失:保存子 webview 的状态和来自 onCreateWindow() 的消息参数,销毁子 webview,再次创建 webview,设置状态,并设置新目标的新目标子网页视图。
在 SecondActivity 的 finish() 中关闭键盘。
1/2/3的组合