如何从Android中的JavaScript获取对/错?

时间:2019-01-14 14:55:39

标签: javascript android

我想在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()中获得最终结果?

1 个答案:

答案 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();
    }
}