2010-08-26 27 views
11

Tôi có một ứng dụng Android tải các trang web trong một hoạt động với một WebView. Tôi đang sử dụng truy xuất trang theo cách thủ công và sử dụng loadDataWithBaseURL của WebView để hiển thị trang đó trên màn hình. Mọi thứ đều ổn.Android: Phương thức của WebView goBack() hiển thị một trang trống

Bây giờ, tôi đang cố gắng ghi đè nút Quay lại để mô phỏng trở lại trong ngăn xếp lịch sử WebView. Tôi có thể ghi đè lên nút Quay lại, tôi có thể thấy rằng có một ngăn xếp lịch sử trong WebView, tôi có thể thấy url lịch sử là chính xác, nhưng khi tôi gọi phương thức goBack() của WebView), nó sẽ hiển thị một trang trống .

Bất kỳ ai gặp phải điều này trước đây hoặc cho tôi một vài đề xuất để tiếp tục điều này?

Chỉnh sửa: Nếu tôi sử dụng phương thức tải của WebView, nút Quay lại có ghi đè hoạt động như dự định. Nhưng tại sao .... Nếu tôi cần phải xử lý bằng tay, làm thế nào để tôi bắt đầu rối tung với các trang lịch sử?

Trả lời

1

Bạn nên kiểm tra xem phương thức canGoBack() có trả về true không trước khi gọi goBack()

+1

Tôi đã kiểm tra nó. Từ mô tả của tôi trong câu hỏi trên, tôi cũng có thể nhận được url lịch sử (trang trước). Khi tôi thực hiện goBack, nó sẽ hiển thị một trang trống. – Bundeeteddee

6

Tôi cũng gặp vấn đề tương tự. Tôi thấy rằng vấn đề đã biến mất nếu tôi đặt tham số historyUrl trên cuộc gọi để tảiDataWithBaseURL.

+0

Tên thông số đã thay đổi gần đây thành 'failUrl' – ohhorob

+2

chúng ta nên đặt giá trị nào trong historyUrl –

+0

Tôi đã thử đặt historyUrl thành html/url/wathever, nhưng không thành công ... Có ai đã thành công với điều đó không? – miniBill

0

Giải pháp duy nhất tôi đã tìm thấy là để tạo ra một Stack < Chuỗi > và tự quản lý lịch sử

0

Tôi đã có cùng một vấn đề và tôi đã thử tất cả câu trả lời nhưng không giúp (thử nghiệm tất cả các ứng dụng trên Nexus 5 đang chạy Marshmallow). Giải pháp loadDataWithBaseURL không liên quan đến tôi khi tôi đang sử dụng loadUrl thay thế.

Bây giờ, đây không phải là giải pháp nhưng điều mà tôi may mắn nhận thấy. Điều này thực sự kỳ lạ và chỉ hoạt động nếu url mục tiêu kết thúc bằng .html. Ý định của tôi là giúp bất cứ ai đối mặt với vấn đề này khi tôi biết làm thế nào gây phiền nhiễu này có thể được. Vì vậy, xin vui lòng chịu với tôi, xin vui lòng không bỏ phiếu bình chọn này nếu bạn nghĩ rằng điều này là vô nghĩa.

Điều tôi nhận thấy là nếu url kết thúc bằng .html, màn hình trắng xuất hiện khi nhấn nút quay lại.

Mặt khác, nếu bạn xóa .html khỏi url của mình - rõ ràng chỉ khi trang web này được trang web đó hỗ trợ (nghĩa là chuyển hướng và tất cả được xử lý đúng ở phía máy chủ và nó không kích hoạt Trang 404 Không tìm thấy lỗi), url đó sẽ đóng vai trò là cơ sở thời gian này và khi bạn nhấn nút quay lại, màn hình trắng sẽ không xuất hiện lần này.

ví dụ: bạn phải thay thế http://example.com/page.html tới: http://example.com/page

Một lần nữa, tôi không đăng này mà không cần kiểm tra kỹ lưỡng - công trình này cho tôi ngày hôm nay và hạnh phúc mà tôi tìm thấy này và tôi hy vọng rằng nó sẽ giúp bạn cũng vậy.

0

Cách tôi giải quyết vấn đề này là giữ một con trỏ ngăn xếp cục bộ với số trang đã tải sau khi trang gốc được tải bằng cách sử dụng loadDataWithBaseURL.Khi quay lại, nếu con trỏ của tôi chạm 1 Tôi ở cấp cơ sở và tải lại trang gốc bằng loadDataWithBaseURL.

FYI, tôi sử dụng mã này trong Hoạt động có phân đoạn, do đó các đoạn thực hiện giao diện IBackButtonListener giúp tôi nắm bắt nút quay lại trong hoạt động chính và truyền sự kiện cho đoạn hiện tại. Nếu đoạn trả về đúng nghĩa là nó đã xử lý sự kiện.

IBackbuttonListener.java

public interface IBackButtonListener { 
    public boolean onBackButtonPressed(); 
} 

Fragment mà thực hiện IBackButtonListener và có một webview nạp từ dữ liệu html.

private int historyStackPointer = 0; 

    ... 

     @Override 
      public boolean onBackButtonPressed() { 
       boolean rtn = false; 

       if (webView.canGoBack()) { 
        if(historyStackPointer > 1) { 
         webView.goBack(); 
         historyStackPointer--; 
         rtn = true; 
        }else{ 
         if(historyStackPointer == 1) { 
          // Reload the html data 
          webView.loadDataWithBaseURL("file:///android_asset/", html_data, "text/html", "UTF-8", null); 
          historyStackPointer = 0; 
          rtn = true; 
         }else{ 
          webView.loadUrl("about:blank"); 
          rtn = false; 
         } 
        } 
       } else { 
        rtn = false; 
       } 
       return rtn; 
      } 

html_data là một chuỗi có html của trang.

Các vấn đề liên quan