我想在Android中的 WebView
中覆盖后退按钮的行为,以便在网页(在WebView
中)中打开确切菜单时,按钮应关闭菜单,而不要转到上一页。
我知道如何使用send data from JavaScript to Android,但是对于如何在if()
块中使用回调数据感到困惑(未在链接的问题的公认答案中列出):>
好的。我使用的逻辑类似于以下代码:
if ( isMenuOpen() ){
closeMenu();
return true;
}
else{
//Let the back button do its default behavior
}
isMenuOpen()
调用JavaScript函数以检查菜单是否打开:
public void isMenuOpen(){
webview.loadUrl="javascript:isMenuOpen()";
}
这是我的JavaScript函数,它使用JavaScriptInterface
将结果传递给Java函数:
function isMenuOpen(){
if ($(".menu").hasClass("open")){
jInterface.resultFunction(true);
}
else{
jInterface.resultFunction(false);
}
}
这是最终的Java函数,可从JavaScript输出中检索数据:
@JavascriptInterface
public boolean resultFunction(boolean result){
return result;
}
问题在于isMenuOpen()
是一个无效函数,仅调用JavaScript函数。我应该如何改变逻辑以在isMenuOpen()
中获得最终结果?
答案 0 :(得分:0)
您将无法创建调用JavaScript并返回结果的同步方法。这是因为与JavaScript端的通信本质上是异步的。
您可以做的是以异步方式处理用例。当按下后退按钮时,首先将控件传递给JS端,并允许它处理所需的事件。如果JS端不想处理该事件,则应通过调用JavascriptInterface函数将控件传递回Java端。
在代码中:
Java Side:
public class MainActivity extends AppCompatActivity {
private WebView webview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webview = findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setAllowFileAccessFromFileURLs(true);
webview.addJavascriptInterface(this, "jInterface");
webview.loadUrl("file:///android_asset/index.html");
}
@Override
public void onBackPressed() {
webview.loadUrl("javascript:onBackPressed()");
}
@JavascriptInterface
public void onBackPressedWhenMenuClosed() {
// This will be called on a JavaScript bridge thread, so we post a job to the UI thread.
runOnUiThread(new Runnable() {
@Override
public void run() {
MainActivity.super.onBackPressed();
}
});
}
}
JavaScript端:
function onBackPressed() {
if ($(".menu").hasClass("open")) {
// Close the menu
} else {
jInterface.onBackPressedWhenMenuClosed();
}
}