我一直试图通过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。有谁知道我的代码为什么会这样?
答案 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");
}
});
}