[[Android関連]] > JavaScriptからネイティブのUIを変更する(Android)
* JavaScriptからネイティブのUIを変更する(Android) [#c82aa6e6]
#setlinebreak(on)

#contents

** 説明 [#s3921dca]
#html(<div style="padding-left:20px;">)
Androidではメインのスレッド以外はUIを変更する事はできない。(例外が発生する)
この為、メインスレッド以外からUIを変更する場合は、Handler を使用する。
※WebViewに表示したWebページはメインスレッドではない。
#html(</div>)

以下は、WebViewに表示したHTML上から、ネイティブ(Androidアプリ)側の UI を変更するサンプル。

** activity_main.xml [#n67d527c]
#myhtmlcode(){{
<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 [#q2e530d9]
#mycode(){{
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 [#baf3f30b]
#mycode(){{
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 [#v2628ffa]
#myhtmlcode(){{
<!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>
}}


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS