Имам WebView, съдържащ HTML данни. Данните се генерират по време на изпълнение. Основна функция на моето приложение е подчертаването на определени части от тези HTML данни. Опитах това с помощта на javascript.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_reader_page, container, false);
webview = (WebView) rootView.findViewById(R.id.resultText);
webview.getSettings().setJavaScriptEnabled(true);
String page = makeHTML();
webview.loadUrl("file:///android_asset/jquery-1.8.2.js");
webview.loadUrl("file:///android_asset/src_javascript.js");
webview.loadData(page, "text/html", "UTF-8");
return rootView;
}
private String makeHTML() {
StringBuilder sb = new StringBuilder();
sb.append("<!DOCTYPE html>\n");
sb.append("<html>\n");
sb.append("<head>\n");
sb.append("</head>\n");
sb.append("<body>\n");
sb.append(tokenizedText + "\n");
sb.append("</body>\n");
sb.append("</html>\n");
return sb.toString();
}
tokenizedText
са моите генерирани по време на изпълнение данни с този формат:
<YT_SEN id="_YT_SEN_0">This is my first sentence.</YT_SEN>
<YT_SEN id="_YT_SEN_1">This is my second sentence.</YT_SEN>
...
Когато моите данни се заредят в WebView, потребителят може да маркира конкретно изречение, като даде неговия номер. След това този метод извиква съответната javascript функция:
public void highlightSentence(int sent_id) {
if (android.os.Build.VERSION.SDK_INT < 19) {
webview.loadUrl("javascript:highlightSentence('_YT_SEN_" +sent_id+ "', " +color+ ")");
} else {
webview.evaluateJavascript("javascript:highlightSentence('_YT_SEN_" +sent_id+ "', " +color+ ")", null);
}
}
Функцията на JavaScript за подчертаване (дефинирана във file:///android_asset/src_javascript.js):
function highlightSentence(object,color)
{
document.getElementById(object).style.backgroundColor = color;
}
Резултатът от Logcat, когато изпълня метода highlightSentence:
I/chromium﹕ [INFO:CONSOLE(1)] "Uncaught ReferenceError: highlightSentence is not defined", source: (1)
По някакъв начин WebView не може да намери функцията highlightSentence. Мисля, че е заради начина, по който зареждам файловете на Javascript и JQuery. И все пак не знам (и не мога да намеря) правилния начин за зареждане на външни js-файлове в генерираните по време на изпълнение HTML данни.
Забележка: Използвам WebView единствено за офлайн употреба, нямам нужда от никаква интернет комуникация. WebView изглеждаше като най-лесният начин за активиране на динамично подчертаване.