使用Angular更改Webview URL

时间:2017-09-22 15:32:18

标签: javascript java android angularjs webview

我一直试图通过AngularJs调用一个函数来改变我的webview URL,但到目前为止我没有成功。

这是我的角度课程:

app.controller("speechController", function($scope){
    $scope.page = 'index.html';
    $scope.url = function(page){
        Android.receivePage();
    }
});

这是我的Java类:

public class MainActivity extends AppCompatActivity {


    Button b;
    CustomWebViewClient customWebViewClient;
    WebView myWebView;
    private TextToSpeech tts;
    private final int REQ_CODE_SPEECH_INPUT = 100;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);



        myWebView = (WebView) findViewById(R.id.webView);
        myWebView.addJavascriptInterface(this, "Android");
        myWebView.setWebViewClient(new WebViewClient());
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        myWebView.loadUrl("file:///android_asset/index.html");
        b= (Button)  findViewById(R.id.button);
        b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                receivePage();

            }
        });

    }



    @JavascriptInterface
    public void receivePage() {
        myWebView.loadUrl("file:///android_asset/index.html");
    }
}

请注意,我在onCreate中创建了一个按钮,只是为了调用receivePage函数进行测试。通过调试,我注意到Angular函数和按钮onClick函数都正确调用了receivePage(),但是只有按钮正确地更改了URL。由于项目的必要性,我需要使用angular来改变webview。有谁知道我的代码为什么会这样?

1 个答案:

答案 0 :(得分:1)

我想通了,所以我会把它发布在这里以防其他人有同样的问题。所以,问题是JavascriptInteface使用与webview不同的线程,而webview只接受同一线程发出的请求,我只需要替换:

@JavascriptInterface
public void receivePage() {
    myWebView.loadUrl("file:///android_asset/index.html");
}

使用:

@JavascriptInterface
public void receivePage() {
    myWebView.post(new Runnable() {
        @Override
        public void run() {
            myWebView.loadUrl("file:///android_asset/index.html");
        }
    });
}