質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1611閲覧

Android WebView <a>タグ内のURLが変動してしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/07/03 01:23

編集2019/07/03 01:42

いつもお世話になってます。

Google Mapsを使用した地図アプリを作成しているのですが、
WebViewで原因がわからないところがあり、質問させていただきます。

期待動作は、以下の通りです。
① HTMLのaタグより http://XXXXX/latlng/緯度/経度/タイトル」 のリンクをタップ
② MapsActivityへ遷移してマーカーを表示

上記、一度目は成功しますが、以下の手順を踏むとアプリが最終的に落ちてしまいます。
① Markerをタップし、タイトルを表示させる
② 端末の戻るボタンを押下
③ 再度WebView内のリンクを押下
④ Markerがどこかの海に置かれ、タイトルが表示されない
⑤ 端末の戻るボタンを押下
⑥ 再度WebView内のリンクを押下
⑦ アプリが落ちる

各々のタイミングでのログは以下です。

log1

1//① Markerをタップし、タイトルを表示させる 2$adb logcat | grep URLCHECKER 3-------------------------------- 407-03 09:48:26.316 31516 31516 D URLCHECKER: 41.40360905003219/2.174338884964473/サクラダファミリア 507-03 09:48:26.316 31516 31516 D URLCHECKER: 41.40360905003219 607-03 09:48:26.316 31516 31516 D URLCHECKER: 2.174338884964473 707-03 09:48:26.316 31516 31516 D URLCHECKER: サクラダファミリア 8--------------------------------

log2

1//④ Markerがどこかの海に置かれ、タイトルが表示されない 2$adb logcat | grep URLCHECKER 3-------------------------------- 407-03 09:48:32.317 31516 31516 D URLCHECKER: 452/2.174338884964473/サクラダファミリア 507-03 09:48:32.317 31516 31516 D URLCHECKER: 452 607-03 09:48:32.317 31516 31516 D URLCHECKER: 2.174338884964473 707-03 09:48:32.317 31516 31516 D URLCHECKER: サクラダファミリア 8--------------------------------

log3

1//⑦ アプリが落ちる 2$adb logcat | grep URLCHECKER 3-------------------------------- 407-03 09:48:38.149 31516 31516 D URLCHECKER: .174338884964473/サクラダファミリア 507-03 09:48:38.150 31516 31516 D URLCHECKER: .174338884964473 607-03 09:48:38.150 31516 31516 D URLCHECKER: サクラダファミリア 7--------------------------------

このように
log1 では正常に値の取得ができています。
log2 では緯度が「452」になってしまいます。
log3 では経度の小数点以降のみ取得されます。

予測としては、タイトル(サクラダファミリア)は変動していないので、
URLに小数点が入っているからこの現象がおこるのかなとも思いますが、
仕様としてURLのは変更することが許されません。

どうすれば良いでしょうか。。。

ちなみに、以下がコードになります。

html

1//test.html 2<a href="http://XXXXX/latlng/41.40360905003219/2.174338884964473/サクラダファミリア">地図上で確認</a>

Java

1//TestActivity 2public class Test1Activity extends AppCompatActivity { 3 4 private WebView webView; 5 private int urlIndex; 6 String[] map_info; 7 8 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_column1); 14 15 showWebView(); 16 17 intent_maps(); 18 19 } 20 21 22 23 24 /** 25 * 端末の戻るボタンでブラウザバック 26 */ 27 public boolean onKeyDown(int keyCode, KeyEvent event) { 28 29 if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) { 30 webView.goBack(); 31 return true; 32 } 33 34 return super.onKeyDown(keyCode, event); 35 36 } 37 38 39 40 41 42 /** 43 * webviewを表示 44 */ 45 void showWebView() { 46 47 webView = findViewById(R.id.webView); 48 webView.setWebViewClient(new WebViewClient()); 49 50 /*---------- 51 WEB_URL => どこに向けるか 52 ------------*/ 53 String WEB_URL = "http://XXXX/YYYYY/ZZZZ"; 54 55 //URLをlat,lng,titleにseparateするのに必要 56 urlIndex = WEB_URL.length(); 57 58 webView.loadUrl(WEB_URL); 59 webView.getSettings().setJavaScriptEnabled(true); 60 61 } 62 63 64 65 66 67 /** 68 * 1. WebViewから、aタグのURL(文字列)を取得 69 * 2. 遷移させるか否かはboolで判定 70 * => trueで遷移させない 71 * => falseで遷移させる 72 * 3. separate_url() でURLをlat,lng,titleに分割 73 * separate_url() でmap_infoに情報を格納 74 * 4. map_infoをMapsActivityに渡してMarkerを表示 75 * ----------------------- 76 *   map_info[0] => lat 77 *   map_info[1] => lng 78 *   map_info[2] => title 79 * ----------------------- 80 */ 81 private void intent_maps() { 82 83 webView.setWebViewClient(new WebViewClient() { 84 @Override 85 public boolean shouldOverrideUrlLoading(WebView view, String url) { 86 if(separate_url(url)){ 87 88 89 Log.d("CHECKURL",map_info[0]); 90 Log.d("CHECKURL",map_info[1]); 91 Log.d("CHECKURL",map_info[2]); 92 93 Intent intent = new Intent(TestActivity.this, MapsActivity.class); 94 95 /*---------- 96 flag 「2」を渡すことでTestActivityから遷移していることを識別する 97 ------------*/ 98 intent.putExtra("flag",2); 99 intent.putExtra("fromColumn",map_info); 100 startActivity(intent); 101 102 return true; 103 }else{ 104 return false; 105 } 106 } 107 }); 108 109 } 110 111 112 113 114 /** 115 * 1. urlに/latlng/ が含まれているか確認。 116 * 2. latlang/ より前の文字列を削除 117 * 118 * @param url  119 * @return bool 120 */ 121 private boolean separate_url(String url) { 122 123 /*----------- 124 URLに/latlng/があれば「map_info」にlat,lng,titleを配列で保持 125 返り値はtrue 126 -------------*/ 127 if(url.contains("/latlng/")) { 128 129 String decodedUrl = decodeUrl(url); 130 131 String url_ltlg = "latlng/"; 132 urlIndex += url_ltlg.length(); 133 134 String substrUrl = decodedUrl.substring(urlIndex); 135 map_info = substrUrl.split("/"); 136 137 return true; 138 } 139 140 return false; 141 142 } 143 144 145 146 147 /** 148 * URLをデコード 149 * @param url 150 * @return 151 */ 152 private String decodeUrl(String url) { 153 154 try { 155 String decodedUrl = URLDecoder.decode(url, "UTF-8"); 156 157 return decodedUrl; 158 }catch (UnsupportedEncodingException e) { 159 160 return "Cannot decode"; 161 } 162 163 } 164 165}

お力をお貸ししていただけますと幸いです。
何卒、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

URLが変動するのではなく、URLをsplitする際の文字列のカウント方法が不具合を引き起こす原因でした。

Androidでは、Activityを被せていくようなので
端末の戻るボタンを押下した時に、Activityが初期化されるわけではなく、
前の状態を引き継いでいたので、private int urlIndex; が値を保持していたことにより
「latlng/(7文字)」分が2回め、3回めとプラスされていたので
String[] map_infoの緯度経度の値が変わっていたためでした。

お騒がせいたしました。

Java

1//TestActivity 2public class Test1Activity extends AppCompatActivity { 3 4 private WebView webView; 5 private String web_url; //<------------変更 6 String[] map_info; 7 8 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_column1); 14 15 showWebView(); 16 17 intent_maps(); 18 19 } 20 21 22 23 24 /** 25 * 端末の戻るボタンでブラウザバック 26 */ 27 public boolean onKeyDown(int keyCode, KeyEvent event) { 28 29 if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) { 30 webView.goBack(); 31 return true; 32 } 33 34 return super.onKeyDown(keyCode, event); 35 36 } 37 38 39 40 41 42 /** 43 * webviewを表示 44 */ 45 void showWebView() { 46 47 webView = findViewById(R.id.webView); 48 webView.setWebViewClient(new WebViewClient()); 49 50 /*---------- 51 WEB_URL => どこに向けるか 52 ------------*/ 53 web_url = "http://XXXX/YYYYY/ZZZZ"; // <------------変更 54 55 webView.loadUrl(WEB_URL); 56 webView.getSettings().setJavaScriptEnabled(true); 57 58 } 59 60 61 62 63 64 /** 65 * 1. WebViewから、aタグのURL(文字列)を取得 66 * 2. 遷移させるか否かはboolで判定 67 * => trueで遷移させない 68 * => falseで遷移させる 69 * 3. separate_url() でURLをlat,lng,titleに分割 70 * separate_url() でmap_infoに情報を格納 71 * 4. map_infoをMapsActivityに渡してMarkerを表示 72 * ----------------------- 73 *   map_info[0] => lat 74 *   map_info[1] => lng 75 *   map_info[2] => title 76 * ----------------------- 77 */ 78 private void intent_maps() { 79 80 webView.setWebViewClient(new WebViewClient() { 81 @Override 82 public boolean shouldOverrideUrlLoading(WebView view, String url) { 83 if(separate_url(url)){ 84 85 86 Log.d("CHECKURL",map_info[0]); 87 Log.d("CHECKURL",map_info[1]); 88 Log.d("CHECKURL",map_info[2]); 89 90 Intent intent = new Intent(TestActivity.this, MapsActivity.class); 91 92 /*---------- 93 flag 「2」を渡すことでTestActivityから遷移していることを識別する 94 ------------*/ 95 intent.putExtra("flag",2); 96 intent.putExtra("fromColumn",map_info); 97 startActivity(intent); 98 99 return true; 100 }else{ 101 return false; 102 } 103 } 104 }); 105 106 } 107 108 109 110 111 /** 112 * 1. urlに/latlng/ が含まれているか確認。 113 * 2. latlang/ より前の文字列を削除 114 * 115 * @param url  116 * @return bool 117 */ 118 private boolean separate_url(String url) { 119 120 /*----------- 121 URLに/latlng/があれば「map_info」にlat,lng,titleを配列で保持 122 返り値はtrue 123 -------------*/ 124 if(url.contains("/latlng/")) { 125 126 String decodedUrl = decodeUrl(url); 127 128 String url_ltlg = "latlng/"; 129 int urlNum = web_url.length() + url_ltlg.length(); //<------------変更 130 131 String substrUrl = decodedUrl.substring(urlIndex); //<------------変更 132 map_info = substrUrl.split("/"); 133 134 return true; 135 } 136 137 return false; 138 139 } 140 141 142 143 144 /** 145 * URLをデコード 146 * @param url 147 * @return 148 */ 149 private String decodeUrl(String url) { 150 151 try { 152 String decodedUrl = URLDecoder.decode(url, "UTF-8"); 153 154 return decodedUrl; 155 }catch (UnsupportedEncodingException e) { 156 157 return "Cannot decode"; 158 } 159 160 } 161 162}

投稿2019/07/03 02:20

編集2019/07/03 02:21
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問