Đang tải tệp .html hiện có bằng WebView android


86

Tôi đã thử các mẫu, bản trình diễn từ mã Google và các tài nguyên khác WebView, nhưng khi tôi cố gắng làm điều đó bằng mã của riêng mình, nó không hiệu quả với tôi.

Tôi muốn tải myfile.htmlmà tôi đã đặt trong thư mục nội dung và sử dụng:

private WebView myWebView;

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

Trên trình giả lập hiển thị lỗi

file:///android_assets/myfile.htmlKhông thể tải trang web tại : Không tìm thấy tệp được yêu cầu. /android_assets/myfile.html

Khi tôi đặt tệp đó vào res/raw/thư mục và sử dụng:

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

thì chỉ có giả lập android 2.2 API cấp 8 mới có thể tải được tệp, các phiên bản cũ khác cũng hiển thị lỗi tương tự. Tui bỏ lỡ điều gì vậy?

Có cách nào để tải tệp .html hiện có trong gói ứng dụng hoạt động trên tất cả các phiên bản API không?

Câu trả lời:


161

ok, đó là sai lầm rất ngu ngốc của tôi. Tôi đăng câu trả lời ở đây chỉ trong trường hợp ai đó có cùng một vấn đề.

Đường dẫn chính xác cho các tệp được lưu trữ trong thư mục tài sản là file:///android_asset/*(không có "s" cho thư mục tài sản mà tôi luôn nghĩ rằng nó phải có "s").

Và, mWebView.loadUrl("file:///android_asset/myfile.html");hoạt động ở tất cả các cấp API.

Tôi vẫn chưa tìm ra lý do tại sao mWebView.loadUrl("file:///android_res/raw/myfile.html");chỉ hoạt động trên API cấp 8. Nhưng nó không quan trọng bây giờ.


50
FWIW Tôi không nghĩ đó là một sai lầm ngu ngốc. Tôi đã phạm cùng một sai lầm bây giờ, hai lần. Nó không trực quan! Đầu tiên hãy tạo một thư mục có tên là "tài sản" sau đó tham chiếu đến nó bằng "android_asset" (không có "s") ?? Đó là nền tảng đó là ngu ngốc, IMO: P
richtaur

3
xấu rawđã không hoạt động. Tôi sẽ sử dụng cho raw-de, raw-frvà như vậy. Bây giờ tôi phải tự làm.
Martin

tôi đã thử theo cách tương tự do laph hướng dẫn nhưng khi tôi đặt tệp xml của mình vào thư mục được bạn đề cập đến myWebView.loadUrl ("tệp: ///android_res/raw/myfile.xml"); Nó cho tôi lỗi Đảm bảo internet hoặc đường dẫn là chính xác và khi tôi viết myWebView.loadUrl ("file: //android_res/raw/myfile.xml"); nó không đưa ra bất kỳ lỗi nào nhưng nó cũng không hiển thị gì. Xin hãy giúp tôi trong việc này.
Aditya1510,

2
Xin chào Aditya, tôi tin rằng lỗi đó là do tệp của bạn là .xml. loadUrl giả sử tải một tệp .html. Hãy sửa lại cho tôi nếu tôi sai.
laph

Điều này có khả thi không? Thư mục nội dung chứa Javascript và các tập tin khác, res thư mục / thô chứa các tập tin HTML
user2422690

17

dán tệp .html của bạn vào thư mục nội dung của thư mục dự án của bạn. và tạo một tệp xml trong thư mục bố cục với mã fol: 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"
    />

thêm mã fol trong hoạt động

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

Nếu cấu trúc của bạn phải như thế này:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

Sau đó, chỉ cần làm ( Android WebView: xử lý các thay đổi hướng )

    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());
    }

Hãy chắc chắn rằng bạn thêm

    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);
    }

Sau đó, chỉ cần sử dụng url

<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

Sao chép và dán tệp .html của bạn vào thư mục nội dung của Dự án và thêm mã bên dưới vào Hoạt động của bạn trên 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);

đó là cú chém tripple đã giúp tôi ///
Marc

2

Bạn có thể đọc tệp html theo cách thủ công và sau đó sử dụng loadDatahoặc loadDataWithBaseUrlcác phương pháp của WebView để hiển thị tệp đó.


Xin chào Lucho, cảm ơn câu trả lời của bạn. Bạn có nghĩa là tôi phải chuyển đổi tệp .html của mình thành Chuỗi, sau đó tải nó bằng phương thức loadData hoặc loadDataWithBaseUrl?
laph

2
các tệp .html của tôi khá lớn để chuyển đổi thành chuỗi một cách nhanh chóng. Bất kỳ ý tưởng nào để tải nó với đường dẫn tuyệt đối?
laph

2

Các debug biên soạn là khác biệt so với phiên bản một, vì vậy:

Hãy xem xét cấu trúc tệp Dự án của bạn như thế [ trường hợp này nếu là một tập hợp Gỡ lỗi ]:

src
  |
  debug
      |
      assets
           |
           index.html

Bạn nên gọi index.html vào WebView của mình như:

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

Vì vậy, đối với phiên bản Release, nó sẽ giống như sau:

src
  |
  release
        |
        assets
             |
             index.html

Cấu trúc bên dưới cũng hoạt động, cho cả hai biên dịch [ gỡ lỗi và phát hành ]:

src
  |
  main
     |
     assets
          |
          index.html
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.