我在WebView中调用JavaScript函数并在应用程序中获取响应时遇到了一些问题(在我的Galaxy Tab 2 '10上)。我在内容加载后直接调用js-function。根据{{3}}我使用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代码,只需将资产dir放在一个空的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)。只要它不起作用。它是硬编码,所以我仍然在寻找一个好的解决方案。
答案 0 :(得分:1)
我希望这会有所帮助,但我不能肯定地说,因为您没有展示在方向更改后如何恢复WebView。
我很难让我的嵌套片段在方向更改后正常工作。我希望在屏幕旋转期间保留表单值和所有功能。这一切都很好,除了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;
}