Android関連 > JavaScriptからネイティブのUIを変更する(Android) JavaScriptからネイティブのUIを変更する(Android) †説明 †Androidではメインのスレッド以外はUIを変更する事はできない。(例外が発生する) 以下は、WebViewに表示したHTML上から、ネイティブ(Androidアプリ)側の UI を変更するサンプル。 activity_main.xml †<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="0dp" > <EditText android:id="@+id/editText1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:inputType="text|textUri" > </EditText> </LinearLayout> <WebView android:id="@+id/webView1" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:layout_marginTop="0dp" android:focusable="true" android:focusableInTouchMode="true"> <requestFocus /> </WebView> </LinearLayout> MainActivity.java †import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.webkit.WebView; import android.widget.TextView; public class MainActivity extends Activity { private static final String START_URL = "file:///android_asset/index.html"; public Handler handler = null; @Override protected void onCreate(Bundle savedInstanceState) { Log.d("DEBUG", "onCreate"); // メインViewをセット super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // WebView で JavaScript を使用可能にしておく WebView webview = (WebView) findViewById(R.id.webView1); webview.getSettings().setJavaScriptEnabled(true); // JavaScriptインターフェースに 自身のインスタンスと handler を渡しておく handler = new Handler(); MainJsInterface jsIf new MainJsInterface(this, handler); webview.addJavascriptInterface(jsIf, "Android"); // ページ読み込み後のイベント設定 webview.setWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url) { TextView text = (TextView) findViewById(R.id.editText1); text.setText(url); } }); // ページ読み込み webview.loadUrl(START_URL); } } MainJsInterface.java †public class MainJsInterface { Activity activity; Handler handler; MainJsInterface(Activity a, Handler h){ activity = a; handler = h; } @JavascriptInterface public void setText(final String text){ handler.post(new Runnable(){ @Override public void run() { TextView textView = (TextView) activity.findViewById(R.id.editText1); textView.setText(text); } }); } } index.html †<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <script type="text/javascript"> var setAndroidViewText = function(){ var text = document.getElementById('text1').value; Android.setText(text); }; </script> </head> <body> <input type="text" id="text1" value="TEST1" > <input type="button" onclick="setAndroidViewText();"> </body> </html> |