2012-01-20 3 views
4

я загружаю страницу активов HTML в WebView с использованиемИзменение HTML в WebView программно

webMain.loadUrl("file:///android_asset/record.html"); 

, который прекрасно работает, но внутри HTML ряд мест, где я хотел бы использовать информацию приложение. Например, HTML может содержать текст, который читает «[Пользовательский]». Есть ли способ заменить это слово информацией, переданной из приложения?

ответ

4

На самом деле я не понимаю, почему размер файла record.html будет влиять в ОБСЛУЖИВАНИЕ кода. Прочитайте строку html (используя класс читателя Java или что-либо еще) из html-файла в актив, используйте функцию replaceAll с помощью Regex, чтобы заменить все [Custom] в html-файле. Как долго html не должен влиять на то, как вы поддерживаете код. Это скорее проблема производительности, или строка действительно очень длинная, чем предел java String.

некоторый код я использовал раньше:

InputStream is = getApplicationContext().getAssets().open("details/product_jsmodify.html"); 
Reader r = new InputStreamReader(is); 
String details = Utils.readertoString(r); 
details = details.replace("%product_name%",productName); 

Utils мой класс делает преобразование в строку. Я не использую Regex здесь, поскольку я только заменяю слово на этот раз. Затем я загружаю строку как Cata. Полагаю, это довольно чисто.

+0

Я хочу сделать это, чтобы потому что легче вносить изменения в record.html, чем в документ Java с 200 строками конкатенированной строки. Я пробовал это изменение и, кажется, давал мне правильную информацию, но когда я вызываю webMain.loadData (подробности, «текст/html», null); он дает ошибку страницы, не найденную. Страница, которую не находит, - это весь код в файле record.html. –

+1

, если у вас есть тег . Я думаю, вам может понадобиться использовать loadDataWithBaseURL – reTs

+0

Это оказалось ключом. Благодаря! –

2

Да, вы можете это сделать, загрузив свою страницу в String, а затем загрузите эту строку в свой WebView.

Например:

String summary = "<html><body>You scored <b>192</b> points.</body></html>"; 
webview.loadData(summary, "text/html", null); 

Взятые из here

+0

Это, безусловно, решение, но record.html - это большой файл. В целях поддержания кода я бы предпочел не переделывать все это так. –

+1

К сожалению, я не думаю, что вы можете решить эту проблему без преобразования вашего html в String, потому что я не думаю, что есть способ сообщить вашему веб-обозревателю обновить только некоторые фрагменты html внутри него. – Cata

9

Это старый и уже принятый вопрос, однако я уверен, что проблему можно решить более элегантно, используя javascript.

Храните файл html в папке с вашими ресурсами и окружайте текст, который вы хотите заменить, с элементами div с уникальными идентификаторами.

<html> 
    <head> ... <head> 
    <body> 
    Static text 
    <div id="replace1">replace me</div> 
    <div id="replace2">replace me too</div> 
    More static text ... 
    </body> 
</html> 

Теперь создайте яваскрипта функцию, которая заменит innerHtml из DIV с идентификатором:

function replace(id, newContent) 
    { 
     document.getElementById(id).innerHTML = newContent; 
    } 

Эта функция будет лучше всего помещается непосредственно в HTML-файл, обновите раздел для <head> выглядеть следующим образом:

<head> 
    ... 
    <script type="text/javascript"> 
     function replace(id, newContent) 
     { 
      document.getElementById(id).innerHTML = newContent; 
     } 
    </script> 
</head> 

Теперь мы должны вызвать функцию яваскрипта из из апи WebView Android:

WebView helpView = (WebView)findViewById(R.id.helpView); 
helpView.getSettings().setJavaScriptEnabled(true); 
helpView.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onPageFinished(WebView view, String url) { 
    super.onPageFinished(view, url); 
    view.loadUrl("javascript:replace('replace1', 'new content 1')"); 
    view.loadUrl("javascript:replace('replace2', 'new content 2')"); 
    } 
}); 
helpView.loadUrl("file:///android_asset/help.html"); 

Используя это, вы избегаете считывать потенциально большие данные в память и неоправданно выполнять дорогостоящие операции над ним.

+0

Что делать, если у моего html есть текст? {{UserName}} очень хорош. {{UserName}} - программист. {{UserGender}} также может создавать отличные приложения. «Мне нужно его заменить, - Ричард очень хорошо. Ричард - программист. Он также может разрабатывать отличные приложения. Теперь мне нужно указать два разных идентификатора для {{UserName}} s? – NarendraJi

+0

Могу ли я предоставить те же идентификаторы для аналогичных строк, поскольку у меня может быть несколько html-файлов с разными последовательностями строк, а управление с помощью разных уникальных идентификаторов для одних и тех же строк будет проблематичным – NarendraJi

+0

@DroidWormNarendra В таком случае, я думаю, вы бы использовали класс вместо id. – AdamVe

1

Этот работал для меня, с html вместе с текстом и изображениями.

InputStream is = getAssets().open(html_name); 
      int size = is.available(); 

      byte[] buffer = new byte[size]; 
      is.read(buffer); 
      is.close(); 

      String str = new String(buffer); 
      str = str.replace("InitialTextToBeReplaced", "TextAfterReplacement"); 

     //Now instead of webview.loadURL(""), I needed to do something like - 
      webView.loadDataWithBaseURL("file:///android_asset/", str, "text/html", "UTF-8",null); 
1

Это сработало для меня.

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Payment Demo</title> 
</head> 
<body> 
    <div> 
     <input type="text" id="uname " name="uname " value=""> 
     <input type="text" id="pass" name="pass" value=""> 
    </div> 
</body> 
</html> 

Это код Java.

WebView wb; 
wb = (WebView) findViewById(R.id.webView1); 
wb.loadUrl("file:///android_asset/web1.html"); 
wb.getSettings().setJavaScriptEnabled(true); 

wb.setWebViewClient(new WebViewClient() { 

    @Override 
    public void onPageFinished(WebView web, String url) { 
     // TODO Auto-generated method stub 
     String uname = "[email protected]"; 
     String pass = "******"; 

     view.loadUrl("javascript:(function(){document.getElementById('uname').value = '"+uname+"';})()"); 
     view.loadUrl("javascript:(function(){document.getElementById('pass').value = '"+pass+"';})()"); 

    } 
}); 
+0

Эта строка поможет изменить выбранный вами язык, отраженный в webview android .. Спасибо dude –

+0

wb.getSettings(). SetJavaScriptEnabled (true); –

Смежные вопросы