Android JavascriptInterface问题

时间:2011-07-20 07:43:05

标签: android user-interface webview textview

我是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}}。

是什么原因?我该如何解决?

4 个答案:

答案 0 :(得分:2)

你不能这样做。 javascript接口在新线程中运行(不在主线程中)。 因此,要更改UI(MyWebActivity拥有的文本字段),您需要使用处理程序重新同步事件。

步骤:

  1. MyWebActicity
  2. 中创建处理程序
  3. 在应该更改文本字段的方法的javascript界面​​中,向MyWebActivity发送一条空消息。 (例如:hrefresh.sendEmptMessage(MyHandler.REFRESH_TEXTFIELD))。
  4. 管理处理程序中的空消息,该消息将调用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");
    }
}