gpt4 book ai didi

javascript - 更改配置后通过WebView和JS函数调用JavascriptInterface方法经常不起作用

转载 作者:太空狗 更新时间:2023-10-29 14:18:29 33 4
gpt4 key购买 nike

我在 WebView 中调用 JavaScript 函数并在应用程序中获得响应时遇到了一些问题(在我的 Galaxy Tab 2 '10 上)。我在内容加载后直接调用 js 函数。根据this one solution我用 PictureListener

webView.setPictureListener(new PictureListener() {
@Override
public void onNewPicture(WebView view, Picture picture) {
webView.loadUrl("javascript: JsImpl.init('{response}');");
}
});

它工作正常:加载内容时,onNewPicture 总是启动。 "javascript: JsImpl.init('{response}')加载调用的 js:

class JsImpl {
private final static String LOG_TAG = "JsImpl";

@JavascriptInterface
public void init(String json) {
Log.d(LOG_TAG, json);
}
}

在日志中我看到 D/JsImpl(18400): {response} .似乎一切都很好,但是......

当我在横向或纵向模式下切换选项卡时 WebView重新创建,onNewPicture已启动但方法 public void init(String json)JsImpl通常根本不被调用!

因此,如果我改变方向,有时 js 有效,有时无效。没有异常,没有错误...

谁遇到过同样的问题?

完整代码如下

public class NextActivity extends Activity {

@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);

final WebView wv = (WebView) findViewById(R.id.WebView);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl("file:///android_asset/index.html");
wv.addJavascriptInterface(new JsImpl(), "JsImpl");

wv.setPictureListener(new PictureListener() {
@Override
public void onNewPicture(WebView view, Picture picture) {
wv.loadUrl("javascript: JsImpl.init('{responce}');");
}
});
}

class JsImpl {
private final static String LOG_TAG = "JsImpl";

@JavascriptInterface
public void init(String json) {
Log.d(LOG_TAG, json);
}
}

}

这里不需要html代码,只需在assets目录下放一个空的html文件index.html .


编辑:我找到了一个解决方案,但我不确定它是否正确。但它有效。我添加了处理程序循环

 final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (isJSSetup) return;
Log.i("handler-loop", "JS didn't handle. Reload page");
wv.loadUrl(CONTENT_PAGE);
handler.postDelayed(this, 1000);
}
}, 1000);

当调用@JavascriptInterface init(String json) 时,isJSSetup变成了true .在处理程序循环中,我检查 JS 是否已设置或没有 if (isJSSetup) return; .如果没有 - 我再次重新加载 URL wv.loadUrl(CONTENT_PAGE) 并尝试调用 init(String json)。只要它不起作用。它是硬编码的,所以我仍在寻找一个好的解决方案。

最佳答案

我希望这会有所帮助,但我不能肯定地说,因为您没有显示方向更改后 WebView 是如何恢复的。

我很难让我的嵌套 fragment 在方向改变后正常工作。我想在屏幕旋转期间保留表单值和所有功能。一切正常,除了 JavascriptInterface 在方向更改后永远无法工作。

我的 WebView 在 onCreateView 中恢复。我不得不删除对我的 WebView 的 restoreState 调用,现在一切正常。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

rootView = inflater.inflate(R.layout.layoutT4, container, false);
webView = (WebView) rootView.findViewById(R.id.webViewT4);
prepareBrowser(); // the browser is initiated here including the JavascriptInterface

if (webView != null) {
String URL = (savedInstanceState == null) ? "" : savedInstanceState.getString("URL");
if (URL.equals("")) {
webView.loadUrl("yourhome.html");
} else {
//webView.restoreState(savedInstanceState.getBundle("webViewBundle")); // this line was preventing the JavascriptInterface to work properly
webView.loadUrl(URL); // this is saved in onSaveInstanceState - I just reopen the URL here, the PHP page will take care of reloading the data
}
}
return rootView;
}

关于javascript - 更改配置后通过WebView和JS函数调用JavascriptInterface方法经常不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19245555/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com