Найти решение гуглением не получилось:
http://stackoverflow.com/questions/5907439/get-the-click-event-from-webpage-in-my-android-application
http://stackoverflow.com/questions/5116909/how-i-can-get-onclick-event-on-webview-in-android
Все решения у меня не работали, подсказку нашел тут:
http://stackoverflow.com/questions/11527479/get-event-click-link-in-a-webview-android
Чувак Filipe Batista написал, замутите интерфейс для обработки javascript и дал ссылку на оф документацию по теме:
http://developer.android.com/guide/webapps/webview.html#BindingJavaScript
В общем я решил эту проблему с помощью встраивания javascript в html-код и "проброс" вызова функций в само приложение. Решение работает на API >=8 (android 2.2 и выше).
Первое, сделал класс, расширяющий WebView:
public class TextViewScroller extends WebView {
\\ конструкторы и всякая хрень пропущены
public void loadDataWithBaseURL(String page) {
StringBuilder s = new StringBuilder();
s.append("<!DOCTYPE >");
s.append("<html xmlns=\"http://www.w3.org/1999/xhtml\" debug=\"true\">");
s.append("<head>");
s.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
s.append("<meta name=\"viewport\" ");
s.append("content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\"> ");
s.append("<meta name=\"apple-mobile-web-app-capable\" content=\"yes\"> ");
s.append("<meta name=\"viewport\" content=\"target-densitydpi=device-dpi\" /> ");
s.append("<script type=\"text/javascript\"> ");
s.append("function init(testVal)");
s.append("{");
s.append("AndroidFunction.click(testVal);");
s.append("}");
s.append("</script>");
s.append("</head>");
s.append("<body>");
s.append(page);
s.append("</body></html>");
this.loadData(s.toString(), "text/html; charset=UTF-8", "utf-8");
}
}
Самая главная часть, это метод loadDataWithBaseURL. Тут добавляется шапка для текста с описанием javascript-функции init(testVal) в теле которой происходит вызов функции из интерфейса AndroidFunction.Второе, проинициализировал этот контрол так:
mWebView = (TextViewScroller) findViewById(R.id.TextView1); mWebView.getSettings().setJavaScriptEnabled(true); WebAppInterface www = new WebAppInterface(this); mWebView.addJavascriptInterface(www, "AndroidFunction");Тут включается поддержка javascript контролом, добавляется интерфейс. Сам интерфейс WebAppInterface выглядит так:
private class WebAppInterface {
Context mContext;
/** Instantiate the interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
@JavascriptInterface
public void click(final String link) {
runOnUiThread(new Runnable() {// запуск в потоке UI
@Override
public void run() {
mSearch.setText(link);// вывод в EditText самой ссылки, mSearch - принадлежит activity, а сам этот интерфейс - приватный класс её, например
}
}
});
}
}
Ну и последняя вещь, в самом тексте заместо ссылки надо вставить такие строчки (для того чтобы ссылка выглядела как ссылка):page.append("<input value=\"");
page.append("текст на экране");
page.append("\" type=\"button\" name=\"submit\" style=\"border: none; background: transparent;color: blue;cursor: pointer;padding: 0px;margin-right:0px; \" ");
page.append("id=\"btnSubmit\" onclick=\"javascript:return init(\'");
page.append("текст, который придет в обработчик");
page.append("');\" /> ");
Или такие, чтобы была как кнопка:page.append("<input value=\"");
page.append("текст на экране");
page.append("\" type=\"button\" name=\"submit\" ");
page.append("id=\"btnSubmit\" onclick=\"javascript:return init(\'");
page.append("текст, который придет в обработчик");
page.append("');\"/>");
Комментариев нет:
Отправить комментарий