私はJava code(In activity))へのwebviewのhtmlボタンクリックを検出しようとしていました。
別のSOを紹介しました
Android WebView のjavascriptを介してHTMLボタンのクリックを検出
私のコード:
index.html
<html>
<head>
<script language="javascript">
function js1() {
document.loginform.method="post";
document.loginform.action = "https://example.com/chechlogin.asp";
}
</script>
</head>
<body>
<form name="loginform">
<input type="text" name="empcode" value="58686" /><br/>
<input type="password" name="emppassNTL" />
<input type="submit" name="submit" id="submit_id" onclick="login.performClick();" />
</form>
</body>
</html>
MainActivity.Java
package com.example.webview;
import Android.os.Bundle;
import Android.annotation.SuppressLint;
import Android.app.Activity;
import Android.util.Log;
import Android.view.Menu;
import Android.view.View;
import Android.view.Window;
import Android.webkit.JavascriptInterface;
import Android.webkit.WebSettings;
import Android.webkit.WebView;
import Android.webkit.WebViewClient;
import Android.widget.EditText;
import Android.widget.TextView;
import Android.widget.Toast;
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {
private EditText field;
private WebView browser;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
field = (EditText)findViewById(R.id.urlField);
browser = (WebView)findViewById(R.id.webView1);
browser.getSettings().setJavaScriptEnabled(true);
browser.setWebViewClient(new MyBrowser());
browser.loadUrl("file:///Android_asset/index.html");
}
@SuppressLint("JavascriptInterface")
public void open(View view){
String url = field.getText().toString();
browser.getSettings().setLoadsImagesAutomatically(true);
browser.getSettings().setJavaScriptEnabled(true);
browser.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
browser.loadUrl(url);
browser.addJavascriptInterface(new Object()
{
@JavascriptInterface
public void performClick()
{
Log.d("LOGIN::", "Clicked");
Toast.makeText(MainActivity.this, "Login clicked", Toast.LENGTH_LONG).show();
}
}, "login");
}
private class MyBrowser extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
ただし、performClick()メソッドは呼び出されていません。
エラーを修正してください。
これは私が実装した方法です:
public class FirstActivity extends Activity {
WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
mWebView = (WebView) findViewById(R.id.webView1);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
mWebView.loadUrl("file:///Android_asset/html/File1.html");
}
public class WebAppInterface {
Context mContext;
/** Instantiate the interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
/** Show a toast from the web page */
@JavascriptInterface
public void nextScreen(String pro_cat_id) {
startActivity(new Intent(mContext,
MainActivity.class));
}
そして、htmlファイルで:
javascript:file3.js
function saveId(_id)
{
localStorage.setItem("id", _id);
Android.nextScreen(_id);
}
HTML:
<html>
<head>
<script type="text/javascript" src="arel/js/File3.js"></script>
</head>
<body>
<button onClick="saveId('1');">1</button>
<button onClick="saveId('2');">2</button>
</body>
</html>
これを置き換えてみてください
browser.addJavascriptInterface(new Object()
{
@JavascriptInterface
public void performClick()
{
Log.d("LOGIN::", "Clicked");
Toast.makeText(MainActivity.this, "Login clicked", Toast.LENGTH_LONG).show();
}
}, "login");
これに
Button btnLogin=new Button(ctx);
btnLogin.setOnClickListener(this);
browser.addJavascriptInterface(btnLogin,"login");
@Override
public void onClick(View v) {
//do Something
}
およびindex.html
<html> <head> <script language="javascript"> function js1() {
document.loginform.method="post"; document.loginform.action = "https://example.com/chechlogin.asp";
}
</script> </head> <body> <form name="loginform">
<input type="text" name="empcode" value="58686" /><br/>
<input type="password" name="emppassNTL" />
<input type="submit" name="submit" id="submit_id" onclick="btnLogin.performClick();" />
詳細はこちら: https://developer.Android.com/guide/webapps/webview.html#BindingJavaScript
JavaScriptインターフェイスを作成して、Android=からJavaScriptに渡す必要があります。このインターフェイスをブリッジとして使用して、引数付きの関数呼び出しを渡すことができます。
詳細と例はこちら: http://developer.Android.com/guide/webapps/webview.html#BindingJavaScript
Htmlでは、最初にBtnLoginという名前のボタンをメソッドperformClick()のように作成します:
<input type="submit" name="submit" id="submit_id" onclick="BtnLogin.performClick();" />
Android(アクティビティまたはフラグメント)では、以下のコードを使用します。
private class MyBrowser extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
view.addJavascriptInterface(new Object()
{
@JavascriptInterface
public void performClick() throws Exception //method which you call on button click on HTML page
{
Log.d("LOGIN::", "Clicked");
Toast.makeText(MainActivity.this, "Login clicked", Toast.LENGTH_LONG).show();
}
}, "BtnLogin");// identify which button you click
return true;
}
}
それが役立つことを願っています。
おっと!
performClick()メソッドが間違った場所にありました。
MainActivity.Javaは次のようになります。
package com.example.webview;
import Android.os.Bundle;
import Android.annotation.SuppressLint;
import Android.app.Activity;
import Android.util.Log;
import Android.view.Menu;
import Android.view.View;
import Android.view.Window;
import Android.webkit.JavascriptInterface;
import Android.webkit.WebSettings;
import Android.webkit.WebView;
import Android.webkit.WebViewClient;
import Android.widget.EditText;
import Android.widget.TextView;
import Android.widget.Toast;
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {
private WebView browser;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
browser = (WebView)findViewById(R.id.webView1);
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setLoadsImagesAutomatically(true);
browser.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
browser.setWebViewClient(new MyBrowser());
browser.loadUrl("file:///Android_asset/index.html");
}
private class MyBrowser extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
view.addJavascriptInterface(new Object()
{
@JavascriptInterface
public void performClick() throws Exception
{
Log.d("LOGIN::", "Clicked");
Toast.makeText(MainActivity.this, "Login clicked", Toast.LENGTH_LONG).show();
}
}, "login");
return true;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}