代码之家  ›  专栏  ›  技术社区  ›  Ali Sheikhpour

如何从Android中的javascript中获得正确/错误?

  •  0
  • Ali Sheikhpour  · 技术社区  · 7 年前

    我要重写中后退按钮的行为 WebView 在Android中,当网页中打开一个精确的菜单时(在 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函数,它将结果传递到Java函数中。 JavaScriptInterface :

    function isMenuOpen(){
        if ($(".menu").hasClass("open")){
            jInterface.resultFunction(true);
            }
        else{
            jInterface.resultFunction(false);
        }
    }
    

    这是最后一个Java函数,它从JavaScript输出中检索数据:

    @JavascriptInterface
    public boolean resultFunction(boolean result){
        return result;
    }
    

    问题是 ISMENUN OPEN() 是一个只调用javascript函数的void函数。我应该如何改变逻辑以得到最终的结果 ISMENUN OPEN() ?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Janos Breuer    7 年前

    您将无法创建同步方法,该方法调用JavaScript并返回结果。这是因为与JavaScript端的通信本质上是异步的。

    相反,您可以用异步方式处理您的用例。当按下后退按钮时,首先将控制权传递给JS端,并允许它根据需要处理事件。如果JS端不想处理这个事件,它应该通过调用JavaScript接口函数将控件传递回Java端。

    在代码中:

    Java端:

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