JavaScript 接口(interface)可以工作,但需要调用该函数两次

标签 javascript android android-webview

我尝试通过按 Web 应用程序中的按钮来设置 Android 应用程序的 statusBarColor。我得到了这个工作,但当我按蓝色按钮两次时,应用程序只会显示蓝色状态栏。我做错了什么?

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView mWebView = (WebView) findViewById(R.id.activity_main_webview);

        mWebView.addJavascriptInterface(new WebAppInterface(this), "Android");

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

        mWebView.loadUrl("https://myurl.com");


    }

    public void setColor(String color){
        if(Build.VERSION.SDK_INT >= 21){
            getWindow().setStatusBarColor(Color.parseColor(color));
        }
    }

}

--

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void setStatusBarColor(String color) {
        ((MainActivity)mContext).setColor(color);
    }

}

--

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

    <input type="button" value="White" onClick="setStatusBarColor('#ffffff');" />
    <input type="button" value="Blue" onClick="setStatusBarColor('#0073cf')" />

    <script type="text/javascript">
        function setStatusBarColor(color) {
            Android.setStatusBarColor(color);
        }
    </script>

</body>
</html>

--

任何帮助将不胜感激。我这里没有选择:-(

<小时/>

更新:

经过更深入的调试,我得到:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

最佳答案

好的,我得到了这个工作...我需要在我的 setStatusBarColor android 函数周围添加“runOnUiThread”。所以我的 setColor 函数需要是:

   public void setColor(final String color){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if(Build.VERSION.SDK_INT >= 21){
                    getWindow().setStatusBarColor(Color.parseColor(color));
                }
            }
        });
    }

关于JavaScript 接口(interface)可以工作,但需要调用该函数两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57081287/

相关文章:

javascript - 在 Vis.js,时间轴,刷新显示变化数据

javascript - 将新的排名顺序从“选择组排名”选定的选项延续到“ slider ”

android - 在android上显示yuv420p

java - 无法使用谷歌地图构建应用程序

android - 如何在 Android 的 WebView 中加载 url 以正确查看?

android:background 不适用于 WebView?

javascript - 可以使使用 JQuery .html() 创建的 div 标签可点击吗?

java - Android - 形成指定端口号的 URL 对象

Android Twitter 集成 - 卡在登录页面?

javascript - Highchart 蜘蛛网图表