我是Android初学者。我正在尝试将webview javascript调用中的活动中的textview值更改为javascript接口类。活动布局中有一个webview和一个textview。
MyWebActivity
public class MyWebActivity extends Activity {
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String url = "http://myurl...";
webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebChromeClient(new WebChromeClient());
webview.loadUrl(url);
webview.addJavascriptInterface(new JsInterface(this), "Android");
}
...
}
JsInterface.java
public class JsInterface {
...
public void setUIText()
{
TextView textView1 = (TextView) ((Activity) mContext).findViewById(R.id.textView1);
/*This line not work*/
textView1.setText("Hello");
/*This line work*/
Toast.makeText(mContext, textView1.getText(), Toast.LENGTH_SHORT).show();
}
}
html文件
Android.setUIText();
然后问题是,当我在html文件中调用Android.setUIText()
时,它会触发JsInterface的setUIText,而我无法设置textView1
的文本,但我可以使用{{{{}}获取textView1的文本1}}。
是什么原因?我该如何解决?
答案 0 :(得分:2)
你不能这样做。
javascript接口在新线程中运行(不在主线程中)。
因此,要更改UI(MyWebActivity
拥有的文本字段),您需要使用处理程序重新同步事件。
步骤:
MyWebActicity
。hrefresh.sendEmptMessage(MyHandler.REFRESH_TEXTFIELD)
)。MyWebActivity
中将更改文本字段的方法答案 1 :(得分:2)
只需在 setUIText 功能
中添加这些行 public void setUIText()
{
final String msgeToast = toast + newToast;
myHandler.post(new Runnable() {
@Override
public void run() {
// This gets executed on the UI thread so it can safely modify Views
myTextView.setText(msgeToast);
}
});
Toast.makeText(mContext, textView1.getText(), Toast.LENGTH_SHORT).show();
}
答案 2 :(得分:0)
您可以使用
myTextView.post(...
。
答案 3 :(得分:0)
尝试一下:
final TextView textView1 = (TextView) ((Activity) mContext).findViewById(R.id.textView1);
((Activity) mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
textView1.setText("Hello");
}
}