Проблем с Android JavascriptInterface

Аз съм начинаещ с 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().

каква е причината Как мога да го поправя?


person Air    schedule 20.07.2011    source източник
comment
Получихте ли грешка? Опитайте да отстраните грешки в кода си.   -  person Kumar Bibek    schedule 24.07.2011
comment
Вероятно трябва да получавате страниците си от https:// url, тъй като ненадеждни страници със злонамерен javascript могат да хакнат вашето устройство - вижте stackoverflow.com/questions/ 6415882   -  person NoBugs    schedule 11.09.2013


Отговори (4)


Не можете да направите това. javascript интерфейсът се изпълнява в нова нишка (не в основната). Така че, за да промените потребителския си интерфейс (текстовото поле, притежавано от MyWebActivity), трябва да използвате манипулатор за повторно синхронизиране на събития.

стъпка:

  1. създайте манипулатор във вашия MyWebActicity.
  2. В интерфейса на javascript в метода, който трябва да промени вашето текстово поле, изпратете празно съобщение до вашата MyWebActivity. (напр.: hrefresh.sendEmptMessage(MyHandler.REFRESH_TEXTFIELD)).
  3. управлявайте празното съобщение във вашия манипулатор, който ще извика метод във вашия MyWebActivity, който ще промени текстовото поле
person lorenzo    schedule 04.06.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();
      }  
person Sushil Sharma    schedule 07.06.2012

Можеш да използваш

myTextView.post(...

както добре.

person stdout    schedule 07.11.2016

Опитайте тази:

final TextView textView1  = (TextView) ((Activity) mContext).findViewById(R.id.textView1);
((Activity) mContext).runOnUiThread(new Runnable() {
    @Override
    public void run() {
        textView1.setText("Hello");
    }
} 
person Mu-Tsun Tsai    schedule 12.12.2018