WebView は非表示で良く、HTTP の機能のみ必要です。その為、最低限必要な機能を WebView を継承して実装しています ※ compile 'com.google.code.gson:gson:2.8.2' を使用 DataWebView.java
import android.content.Context; import android.util.AttributeSet; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class DataWebView extends WebView { public DataWebView(Context context) { super(context); init(); } public DataWebView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DataWebView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init(){ // 編集モードの場合は処理を行わない if (isInEditMode()) { return ; } this.getSettings().setDomStorageEnabled(true); this.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); this.getSettings().setJavaScriptEnabled(true); this.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return false; } }); } }
Android と WebView 内の JavaScript とのインターフェイスです JavaScriptAccess.java
import android.util.Log; import android.webkit.JavascriptInterface; public class JavaScriptAccess { // Webページからデータを取得するイベント用 public interface OnGetWebDataListener { abstract public void onWebGetDataListener( String textData ); } private OnGetWebDataListener ogwdl = null; public JavaScriptAccess( OnGetWebDataListener ogwdl ) { this.ogwdl = ogwdl; } @JavascriptInterface public void logcat(String message) { Log.i("lightbox", message); } @JavascriptInterface public void toAndroid(String message) { this.ogwdl.onWebGetDataListener(message); } }
JavaScriptAccess によって(インターフェイス経由の onWebGetDataListener の呼び出し)、JavaScript から呼び出された時のイベントとして、こちら側で処理が可能になっています。 但し、非同期の処理の為、UI スレッドへは直接アクセスできないので、runOnUiThread を使用しています。 MainActivity での実装部分
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import com.google.gson.Gson; public class MainActivity extends AppCompatActivity { private DataWebView dataWebView; private Gson gson; private Syain syain; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gson = new Gson(); dataWebView = (DataWebView) MainActivity.this.findViewById(R.id.webView); MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 呼び出し( 後は、JavaScriptAccess のイベントで待つ ) String callString = String.format("getWebPageData(\"%s\")", "0001"); dataWebView.evaluateJavascript(callString,null); } }); // JavaScript からの戻り dataWebView.addJavascriptInterface(new JavaScriptAccess(new JavaScriptAccess.OnGetWebDataListener() { @Override public void onWebGetDataListener(String textData) { syain = gson.fromJson(textData, Syain.class); MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { TextView textView1 = (TextView) MainActivity.this.findViewById(R.id.textView1); textView1.setText(syain.scode); TextView textView2 = (TextView) MainActivity.this.findViewById(R.id.textView2); textView2.setText(syain.kj); } }); } }), "androidObject"); dataWebView.loadUrl("http://winofsql.jp/002.php"); } }
画面定義
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button"/> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:textSize="30sp"/> <TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:textSize="30sp"/> <com.example.lightbox.webviewtest.DataWebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="visible"/> </LinearLayout>
Syain クラス
public class Syain { public String scode; public String kj; public String furi; public String syozoku; public String seibetu; public String kyuyo; public String teate; public String kanri; public String birth; public String sname; }
Web 側の定義( JavaScript / HTML )
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script> // ************************************** // Android から呼ばれる場合 // console.log は Android 側で表示 // ************************************** if ( typeof androidObject !== 'undefined' ) { window.console.log = function(message){ androidObject.logcat(message); } } function getWebPageData(scode) { $("#param").val(scode); // *************************************** // Android WebView の中のこのページ // より、サーバへアクセスします // *************************************** $.get("dbdata2_json.php?scode="+scode,function( data ){ $("#result").val(JSON.stringify(data)); if ( typeof androidObject !== 'undefined' ) { // サーバから受け取った application/json データ // を文字列に変換して Android に渡します androidObject.toAndroid(JSON.stringify(data)); } else { // 通常のブラウザではこちらが実行されます console.log(JSON.stringify(data,null," ")); } }) } function setWebPageData(sdata) { $("#param").val(sdata); // *************************************** // Android WebView の中のこのページ // より、サーバへアクセスします // *************************************** $.get("dbdata_update_json.php?sdata="+encodeURIComponent(sdata),function( data ){ $("#result").val(JSON.stringify(data)); if ( typeof androidObject !== 'undefined' ) { // サーバから受け取った application/json データ // を文字列に変換して Android に渡します androidObject.toAndroid(JSON.stringify(data)); } else { // 通常のブラウザではこちらが実行されます console.log(JSON.stringify(data,null," ")); } }) } </script> </head> <body> <pre> <input type="button" value="logcat test" onclick="androidObject.logcat('OK')"> <input type="button" value="toAndroid test" onclick="getWebPageData('0001')"> <input type="button" value="toAndroid update" onclick='setWebPageData('{"birth":"2000/10/1","furi":"ウラオカ トモヤ","kj":"浦岡 友也","kyuyo":"270000","scode":"0001","seibetu":"0","sname":"営業部第三","syozoku":"0003","teate":"9000"}')'> <a href="dbdata2_json.php?scode=0001">リンク</a> <textarea id="param" style="width:100%;height:100px;"></textarea> <textarea id="result" style="width:100%;height:100px;"></textarea> </pre> </body> </html>
関連する記事 WebView で JavaScript にデータを渡したい時に注意する事
|
【Android Studio 2の最新記事】
- Android : WebView 経由のデータベースアプリケーション
- WebView で JavaScript にデータを渡したい時に注意する事
- シンプル Android Data Binding : Android Studio 2.2 / 古い定義との違いと、以前のプロジェクトでエラーが出る場合の対処
- Android Studio で、ListView アプリケーションを作成するテンプレート
- Android : Data Binding で ListView へのデータ表示を凄く簡単にする
- Android Studio で理解不能なエラーが出た時の対処方法 : Invalidate Caches / Restart
- Android : TabHost のタブに下から上へのアニメーションを設定して、include で同一画面を使用するので 回転しないように AndroidMainfest で設定する
- Android : TabHost 内の各 TabSpec 内にある TextView の 端末回転時における保存と復帰
- Android の 端末回転時の EditText と TextView の違い
- ViewPager 内のイベントで設定した TextView の値を保持する Fragment 処理
- ExpandableListView を使用して、タップした時に明細データ表示する
- カスタム・リストビュー・ダイアログ : DialogFragment 内の ListView を ArrayAdapter でカスタムする
- カスタム・リストビュー・ダイアログ : ダイアログ内の ListView を ArrayAdapter でカスタムする
- AlertDialog.Builder の setItems(int itemsId, DialogInterface .OnClickListener listener) を使用した、ListVie..
- AsyncTask<Params, Progress, Result> の Progress を無しにして、onPostExecute 内の処理を interface を使って MainA..
- javamail-android + AsyncTask でメール送信を行う為のテンプレート
- tools.jar の callHttpGet のテストと include による画面再利用と HttpPost クラスで掲示板書き込み / Android Studio
- Android の Spinner に関するいろいろな実装と知識 / Android Studio
- AsyncTask を継承して、Drawable を取得する専用クラスを作成する : Android Studio
- Android Studio が 2.0 になりました。前からの内容も含めて整理してます。