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?

laph
fonte

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.

laph
fonte
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.
Naresh
fonte
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">
EpicPandaForce
fonte
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);
Arunkumar
fonte
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.

Lachezar
fonte
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
PYK
fonte