Android JavascriptИнтерфейс проблема - PullRequest
1 голос
/ 20 июля 2011

Я новичок в Android.Я пытаюсь изменить значение textview в активности в вызове javascript webview к классу интерфейса javascript.В макете активности есть веб-просмотр и просмотр текста.

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();

Тогда проблема в том, что когда я вызываю Android.setUIText() в html-файле, он вызывает setUIText JsInterface, и я не могу установить текст для textView1, но я могу получить текст textView1, используя getText().

В чем причина?Как я могу это исправить?

Ответы [ 4 ]

2 голосов
/ 07 июня 2012

Просто добавьте эти строки в ваш 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 голосов
/ 04 июня 2012

Вы не можете сделать это.javascript интерфейс запускается в новом потоке (не в основном).Итак, чтобы изменить свой пользовательский интерфейс (текстовое поле, принадлежащее MyWebActivity), вам нужно использовать обработчик для повторной синхронизации событий.

step:

  1. создать обработчик в вашемMyWebActicity.
  2. В интерфейсе javascript в методе, который должен изменить ваше текстовое поле, отправьте пустое сообщение на ваш MyWebActivity.(например: hrefresh.sendEmptMessage(MyHandler.REFRESH_TEXTFIELD)).
  3. управлять пустым сообщением в вашем обработчике, которое вызовет в вашем MyWebActivity метод, который изменит текстовое поле
0 голосов
/ 12 декабря 2018

Попробуйте это:

final TextView textView1  = (TextView) ((Activity) mContext).findViewById(R.id.textView1);
((Activity) mContext).runOnUiThread(new Runnable() {
    @Override
    public void run() {
        textView1.setText("Hello");
    }
} 
0 голосов
/ 07 ноября 2016

Вы можете использовать

myTextView.post(...

также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...