リンクをクリックした処理
WebViewにリンクを実装したとき、リンクをクリックした処理を実装したサンプルです。
このサンプルでは、リンクをクリックしても特にページを移動させないので次のようにしています。
リンクをクリックしてもページに移動しないように次のいずれかの実装をしています
(1)<a href="#" ~
(2)<a href="javascript:void(0);" ~
AndroidManifest.xmlにインターネットへの接続を許可する設定をしてください。
(例)
<uses-permission android:name="android.permission.INTERNET" />
package test.example.com.test36;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
//Buttonの宣言
import android.view.View;
import android.webkit.JavascriptInterface;
//ログ出力の宣言
import android.util.Log;
import android.webkit.WebViewClient;
import android.widget.RelativeLayout;
import android.webkit.WebView;
import android.widget.TextView;
import android.graphics.Color;
public class MainActivity extends AppCompatActivity {
//setId用の管理番号
private int mNo1=0;;//TextView
private int mNo2=0;;//WebView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
RelativeLayout layout = new RelativeLayout(this);
setContentView(layout);
//座標の初期設定
int x=0;
int y=0;
int width=0;
int height=0;
//配置を設定
x=50;
y=50;
width=330;
height=40;
RelativeLayout.LayoutParams obj1 = getLayoutObject(width, height);
obj1 = getLayoutObject(width, height);
obj1.leftMargin=x;
obj1.topMargin=y;
TextView txt = new TextView(this);
mNo1 = View.generateViewId();
txt.setId(mNo1);
txt.setText("dummy");
txt.setBackgroundColor(Color.YELLOW);
layout.addView(txt,obj1);
x=0;
y=150;
width=430;
height=400;
obj1 = getLayoutObject(width, height);
obj1.leftMargin=x;
obj1.topMargin=y;
WebView web = new WebView(this);
mNo2 = View.generateViewId();
web.setId(mNo2);
//Javascriptの有効有無
//true:有効
//false:無効
web.getSettings().setJavaScriptEnabled(true);
//拡大鏡の表示有無(+と-コントロールによる拡縮)
web.getSettings().setBuiltInZoomControls(true);
testClass cls = new testClass();
web.addJavascriptInterface(cls, "testClass");
//WebViewをレイアウトに追加します
layout.addView(web,obj1);
web.loadData(getHTML(), "text/html", "utf-8");
//ロケーションを判定する処理
web.setWebViewClient(new WebViewClient()
{
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
String request = url;
if(!request.startsWith("app://"))
{
Log.d("test","「app://」から始まるリンク文字列ではありません。");
return false;
}
if(request.equals("app://test_url"))
{
testClass cls = new testClass();
cls.getData("リンクがクリックされました。");
cls=null;
Log.d("test","リンクがクリックされました。");
}
else
{
Log.d("test","上記以外の処理");
return false;
}
return true;
}
});
}
private String getHTML()
{
StringBuilder sHTML = new StringBuilder();
sHTML.append("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN'>");
sHTML.append("<html>");
sHTML.append("<head>");
sHTML.append("<meta http-equiv='Content-Type'");
sHTML.append(" content='text/html; charset=UTF-8'>");
sHTML.append("<script type='text/javascript' language='javascript' >");
sHTML.append("function test1()");
sHTML.append("{ ");
//ここを「app://」から始まるリンク文字列とします
sHTML.append(" document.location=\"app://test_url\";");
sHTML.append("}");
sHTML.append("function test2()");
sHTML.append("{ ");
sHTML.append(" document.getElementById(\"txt1\").value = \"1234567890\";");
sHTML.append("}");
sHTML.append("</script>");
sHTML.append("</head>");
sHTML.append("<body>");
sHTML.append("<form id=frm1 name=frm1>");
//ちょっと下に下げた(微調整)
for(int i=0;i<5;i++)
{
sHTML.append("<br />");
}
//リンクをクリックしてもページに移動しないように次のいずれかの実装をしています
//(1)<a href="#" ~
//(2)<a href="javascript:void(0);" ~
//sHTML.append("<a href=\"#\" onClick=\"test1();\" >send to app</a><br />");
sHTML.append("<a href=\"javascript:void(0);\" onClick=\"test1();\" >send to app</a><br />");
sHTML.append("<br />");
sHTML.append("<a href=\"#\" onClick=\"test2();\" >set num</a><br />");
sHTML.append("<br />");
sHTML.append("<input type=text id=txt1 name=txt1 value=\"\" />");
for(int i=0; i < 20; i++)
{
sHTML.append("<br />");
}
sHTML.append("</form>");
sHTML.append("</body>");
sHTML.append("</html>");
return sHTML.toString();
}
//レイアウトを決定するオブジェクトを生成し渡します
public RelativeLayout.LayoutParams getLayoutObject(int width,int height)
{
return new RelativeLayout.LayoutParams(width, height);
}
public class testClass
{
private String data = "";
@JavascriptInterface
public void getData(String sData)
{
this.data=sData;
//次のエラーを回避するためスレッドを生成
//Only the original thread that created a view hierarchy can touch its views.
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView txt=(TextView)findViewById(mNo1);
txt.setText(data);
}
});
return ;
}
}
}
|
リンクを実装するために次の内容を実装します。
WebView側
「setWebViewClient」を実装します。
「shouldOverrideUrlLoading」を使用してリンクを判定させます。
HTML側
冒頭で紹介したように、aタグでリンク先を次のようにします。
(1)<a href="#" ~
(2)<a href="javascript:void(0);" ~
Javascriptで「document.location="app://test_url";」のようにリンク先を実装します。
このリンクをWebView側の「shouldOverrideUrlLoading」で判定することができます。
このサンプルではクラスを実装してリンクによってTextViewに値を設定しています。
(例)
testClass cls = new testClass();
cls.getData("リンクがクリックされました。");
cls=null;
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="test.example.com.test36">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<!-- インターネットへの接続を許可する設定 -->
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
|
AndroidManifest.xmlに次の設定をします。
インターネットへの接続を許可する設定
(例)
<uses-permission android:name="android.permission.INTERNET" />
実行結果
右側のキャプチャは「send to app」リンクをタップした結果です。
|
|