我正在尝试开发一些基于WebView的简单应用程序,并使Android应用程序和远程页面之间交换数据成为可能。
问题描述:
loadUrl 在 onCreate 内工作,但在 onCreate 外部无法工作。请参阅下面的代码并解释我做错了什么,为什么它在 WebAppInterface 类中不起作用:
public class MainActivity extends Activity {
public WebView view1;
@Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String url = "htxx://mydomain.com/";
final WebView view1 =(WebView) this.findViewById(R.id.webView);
view1.addJavascriptInterface(new WebAppInterface(this), "Android"); //exchange between web-js and webview
WebSettings webSettings = view1.getSettings();
webSettings.setJavaScriptEnabled(true);
view1.loadUrl(url);
view1.setWebViewClient(new com.example.project.MyAppWebViewClient() {
@Override
public void onPageFinished(WebView view1, String url) {
findViewById(R.id.progressBar1).setVisibility(View.GONE);
findViewById(R.id.webView).setVisibility(View.VISIBLE);
}
});
view1.setInitialScale(100);
///// ---> That's works:
view1.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
view1.loadUrl("javascript:somescript('Page is loaded')");
}
});
///// ---> That's works too:
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String device_id = tm.getDeviceId();
view1.loadUrl("javascript:somescript('"+device_id+"')");
}
});
}
public class WebAppInterface {
Context mContext;
WebAppInterface(Context c) {
mContext = c;
}
@JavascriptInterface
public void showToast(String toast) {
//show toast from web-app (js to android)
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
@JavascriptInterface
public void printFromWeb() {
//show toast from web-app (js to android)
///// ---> That's NOT working :(
view1.loadUrl("javascript:somescript('Checking loadurl from outside of onCreate')");
}
}
}
有趣的是,Android studio 中没有出现任何错误。
最佳答案
您有 public WebView view1;
作为一个字段,并且在 onCreate()
中具有完全不同的最终 view1
,因此它实际上在您的 public void printFromWeb()
方法。
这是安全的路线:
要“从外部”访问 WebView,请添加 WebView 类的私有(private)字段:
private WebView webView;
在您的 onCreate()
方法中,实例化它:
webView = (WebView) findViewById(R.id.webView);
添加 getter 方法来访问实例:
public WebView getWebView() {
return webView;
}
记住只能在 UI 线程上触摸它。
<小时/>更新:如何从非 ui 线程安全地访问 View :
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run(){
view1.loadUrl(...)
}
})
关于java - 如何从外部访问onCreate中声明的Webview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36227991/