Carregando arquivo .html existente com android WebView


86

Eu tentei amostras, demos de códigos do Google e outros recursos com WebView, mas quando tento fazer no meu próprio código, não funciona para mim.

Quero carregar o myfile.htmlque coloco na pasta de ativos e usando:

private WebView myWebView;

myWebView.loadUrl("file:///android_assets/myfile.html");

No emulador mostra erro

A página da web em file:///android_assets/myfile.htmlnão pôde ser carregada como: O arquivo solicitado não foi encontrado. /android_assets/myfile.html

Quando coloco esse arquivo na res/raw/pasta e uso:

myWebView.loadUrl("file:///android_res/raw/myfile.html");

então, apenas o emulador Android 2.2 API nível 8 pode carregar o arquivo provavelmente, outras versões anteriores mostram o mesmo erro. Estou esquecendo de algo?

Existe alguma maneira de carregar um arquivo .html existente no pacote do aplicativo que funcione em todas as versões da API?

Respostas:


161

ok, esse foi meu erro muito estúpido. Posto a resposta aqui caso alguém tenha o mesmo problema.

O caminho correto para os arquivos armazenados na pasta de ativos é file:///android_asset/*(sem nenhum "s" para a pasta de ativos que sempre pensei que deveria ter um "s").

E mWebView.loadUrl("file:///android_asset/myfile.html");funciona em todos os níveis de API.

Ainda não entendi por que mWebView.loadUrl("file:///android_res/raw/myfile.html");funciona apenas na API nível 8. Mas isso não importa agora.


50
FWIW Não acho que foi um erro estúpido. Cometi o mesmo erro agora, duas vezes. Não é intuitivo! Primeiro faça uma pasta chamada "ativos" e depois refira-se a ela por "android_asset" (sem "s") ?? É a plataforma que é estúpida, IMO: P
— richtaur

3
para o mal rawnão funcionou. Eu teria uso para raw-de, raw-fre assim por diante. Agora eu tenho que fazer isso sozinho.
— Martin de

tentei da mesma forma guiado por laph mas quando coloquei meu arquivo xml na pasta mencionada por você myWebView.loadUrl ("file: ///android_res/raw/myfile.xml"); Dá-me o erro de verificar se a Internet ou o caminho está correto e quando escrevo myWebView.loadUrl ("file: //android_res/raw/myfile.xml"); não dá nenhum erro mas também não mostra nada.Por favor me ajude nisso.
— Aditya1510

2
Oi Aditya, acredito que o erro seja porque seu arquivo é .xml. loadUrl suponha que carregue um arquivo .html. Por favor me corrija se eu estiver errado.
— laph

Isso é possível? Os ativos da pasta contêm Javascript e outros arquivos, a pasta res / raw contém arquivos HTML
— user2422690

17

cole seu arquivo .html na pasta de ativos da pasta do seu projeto. e crie um arquivo xml na pasta de layout com o seguinte código: my.xml:

<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/webview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
    />

adicionar código fol em atividade

setContentView(R.layout.my);
    WebView mWebView = null;
    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.loadUrl("file:///android_asset/new.html"); //new.html is html file name.

16

Se sua estrutura deve ser assim:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

Depois é só fazer ( Android WebView: lidar com as mudanças de orientação )

    if(WebViewStateHolder.INSTANCE.getBundle() == null) { //this works only on single instance of webview, use a map with TAG if you need more
        webView.loadUrl("file:///android_asset/html/index.html");
    } else {
        webView.restoreState(WebViewStateHolder.INSTANCE.getBundle());
    }

Certifique-se de adicionar

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
        webSettings.setAllowFileAccessFromFileURLs(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);
    }

Então é só usar urls

<html>
<head>
    <meta charset="utf-8">
    <title>Zzzz</title>
    <script src="../scripts/index.js"></script>
    <link rel="stylesheet" type="text/css" href="../css/index.css">

6

Copie e cole seu arquivo .html na pasta de ativos de seu projeto e adicione o código abaixo em sua atividade em onCreate ().

        WebView view = new WebView(this);
        view.getSettings().setJavaScriptEnabled(true);
        view.loadUrl("file:///android_asset/**YOUR FILE NAME**.html");
        view.setBackgroundColor(Color.TRANSPARENT);
        setContentView(view);

foi a barra tripla que me fez ///
— Marc

2

Você pode ler o arquivo html manualmente e então usar os métodos loadDataou loadDataWithBaseUrldo WebView para exibi-lo.


Oi Lucho, obrigado pela sua resposta. Você quer dizer que preciso converter meu arquivo .html em String e carregá-lo com o método loadData ou loadDataWithBaseUrl?
— laph 26/10/10

2
meus arquivos .html são muito grandes para serem convertidos em string rapidamente. Alguma ideia de carregá-lo com caminho absoluto?
— laph

2

A compilação de depuração é diferente da versão , então:

Considere a estrutura de arquivos do seu projeto como esta [ neste caso, se for um conjunto de depuração ]:

src
  |
  debug
      |
      assets
           |
           index.html

Você deve chamar index.html em seu WebView como:

web.loadUrl("file:///android_asset/index.html");

Assim por diante, para a montagem do Release, deve ser assim:

src
  |
  release
        |
        assets
             |
             index.html

A estrutura abaixo também funciona, tanto para compilações [ depuração e lançamento ]:

src
  |
  main
     |
     assets
          |
          index.html
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.