При открытии нового действия Android с веб-представлением вместо HTML-содержимого отображается пустой (белый) экран - PullRequest
24 голосов
/ 02 января 2011

Я занимаюсь исследованиями в течение 2 дней, и я не нашел подобной проблемы нигде в Интернете!

Из основного упражнения я пытаюсь открыть новое действие, содержащее веб-просмотр, который покажетHTML-страница (about.html) в папке android_asset.

Я могу запустить новое действие (test.java) с правильно отображенным веб-представлением, но содержимое веб-страницы просто не отображается.Даже вертикальная полоса прокрутки веб-просмотра отображается (так как содержимое страницы относительно длинное), и я могу прокручивать страницу вверх и вниз, но без содержимого!

package com.example.test;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

public class test extends Activity {
private TextView apppagetitle;
private WebView browser_rn;

@Override
public void onCreate(Bundle saveInstanceState) {
    super.onCreate(saveInstanceState);

    setContentView(R.layout.test);

    browser_rn=(WebView)findViewById(R.id.webkit);
    browser_rn.getSettings().setJavaScriptEnabled(true);
    browser_rn.getSettings().setPluginsEnabled(true);
    browser_rn.setScrollBarStyle(0);       

    final AlertDialog alertDialog = new AlertDialog.Builder(this).create();
    apppagetitle=(TextView)findViewById(R.id.apppagetitle);


    browser_rn.setWebViewClient(new WebViewClient() {

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return false;
        }

        public void onPageFinished(WebView view, String url) {               
            apppagetitle.setText(browser_rn.getTitle());                
        }

        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            if (!isInternetOn()) {
                alertDialog.setTitle("Connection Error");
                alertDialog.setMessage("You need to be connected to the internet.");
            } else {
                alertDialog.setTitle("Error");
                alertDialog.setMessage(description);
            }
            alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    return;
                }
            });
            alertDialog.show();
        }
    });

    browser_rn.loadUrl("file:///android_asset/about.html");
}

public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        browser_rn.clearCache(true);
        browser_rn.clearHistory();
        this.finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
}

Странно то, что новое действие (test.java) может успешно получить и отобразить заголовок веб-страницы в текстовом представлении, когда я вызываю webview.gettitle (), но HTML-содержимое просто не отображается в веб-представлении.Я вижу только пустой экран с полосами прокрутки.Я подозреваю, что это может быть вызвано логическим значением "shouldOverrideUrlLoading".

Обновление:

Спасибо за ответ.

test.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myapp="http://schemas.android.com/apk/res/com.example.test"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:background="@drawable/green"
>
<TextView   
android:id="@+id/apppagetitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="Odd News"
android:textSize="25px"
android:padding="10px"
/> 
</LinearLayout>
<LinearLayout
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
<WebView  
android:id="@+id/webkit"
android:layout_width="fill_parent" 
android:layout_height="0px"
android:layout_weight="1"
/> 
</LinearLayout>
</LinearLayout>

about.html так же просто, как то, что ниже.

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8" /> 
<title>About</title> 
</head> 
<body> 
<h3 style="color:#0066dd">About</h3>  

<p>Some text here...</p>

</body> 
</html>

О, да, и я забыл упомянуть ранее, что с тем же фрагментом кода,иногда появляется about.html, если я принудительно остановлю и перезапущу приложение на своем телефоне.Однако, это тогда не появилось бы в последующих запусках.В тех случаях, когда он успешно обнаруживает файл about.html и я нажимаю кнопку «Назад», чтобы вернуться к основному действию, он снова исчезает при повторном запуске действия из основного действия.Я заблудился, но у меня есть сильное ощущение, что это «shouldOverrideUrlLoading», что я делаю неправильно.

Ответы [ 10 ]

6 голосов
/ 08 ноября 2012

Не пытайтесь загрузить указанный URL-адрес в shouldOverrideUrlLoading, и не возвращайте true из него в вашем случае.Действительно, судя по тому, что вы пытаетесь сделать, вам вообще не нужно его переопределять.

Возвращение true из shouldOverrideUrlLoading указывает WebView, что он должен не загрузить указанный URL.То, что вы делаете - указание WebView начать загрузку снова - может вызвать некоторый внутренний цикл внутри WebView, что, как я догадываюсь, объясняет странное поведение.

2 голосов
/ 28 июля 2012

Используйте это

browser_rn.loadDataWithBaseURL(url); 

вместо

browser_rn.loadUrl("file:///android_asset/about.html");
1 голос
/ 08 августа 2017

Может быть, это из-за аппаратного ускорения

webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

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

1 голос
/ 23 апреля 2013

Попробуйте это изменение в вашем text.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myapp="http://schemas.android.com/apk/res/com.example.test"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".text" > <!-- Here is the change -->
<LinearLayout
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:background="@drawable/green"
>
<TextView   
android:id="@+id/apppagetitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="Odd News"
android:textSize="25px"
android:padding="10px"
/> 
</LinearLayout>
<LinearLayout
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
<WebView  
android:id="@+id/webkit"
android:layout_width="fill_parent" 
android:layout_height="0px"
android:layout_weight="1"
/> 
</LinearLayout>
</LinearLayout>
1 голос
/ 01 октября 2012

Добавьте следующую строку в вашу деятельность, которая содержит активность WebView android:hardwareAccelerated="false"

надеюсь, что это поможет

1 голос
/ 24 августа 2012

Вам нужно вернуть true в методе shouldOverrideUrlLoading

public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
1 голос
/ 16 апреля 2012

Я могу дать другой способ решить эту проблему.Просто скопируйте файл ресурса в путь данных "/data/data/org.test.test/" и загрузите его в WebView следующим образом.

String strHTMLFilePath = "file:///data/data/org.test.test/Files/help_android.html";
webView.loadUrl(strHTMLFilePath);

Используйте следующий код для копированияHTML-файл из ресурса в путь к данным

void getAssetFiles() {

    String  WriteFileName = "/data/data/org.test.test/";
        try {
            String list[] = thisActivity.getAssets().list("Files");
            String outFileName = WriteFileName+"Files/";
            if (list != null)
                for (int i=0; i<list.length; ++i){                          
                if(!new File(outFileName).exists()){
                    new File(outFileName).mkdirs();
                }

                OutputStream myOutput = new FileOutputStream(outFileName+list[i]);

                byte[] buffer = new byte[1024];
                int length;

                String strWritePath = "Files" + "/" + list[i];

                InputStream myInput = thisActivity.getAssets().open(strWritePath);

                while ((length = myInput.read(buffer))>0){
                    myOutput.write(buffer, 0, length);
                }
                myInput.close();

                myOutput.flush();
                myOutput.close();                           
               }
        } catch (IOException e) {

        }

    }
1 голос
/ 11 апреля 2012

Я обновил на прошлой неделе с 2.3.4 до 4.0 на моем HTC Sensation. У двух приложений, которые я написал, был локальный сайт HTML-Contact. На 2.3 он работал нормально, теперь я получаю сайт "Веб-страница недоступна".

Я нашел еще один пост здесь на этом сайте с комментарием: «После некоторого обсуждения с инженером Google кажется, что они приняли решение, что схема file: // небезопасна».

См. Здесь для обхода: Android 4.0.1 ломает локальное хранилище WebView HTML 5?

0 голосов
/ 27 октября 2017

встретить ту же проблему.

Я попробовал решения в ссылка . Неудача все время.

У меня такая же ситуация. В веб-обозрении есть видео H5, оно хорошо работает в первый раз, а затем проваливается когда это не удается, я нашел какое-то сообщение из журнала

  1. onProgressChanged, а не на 100% без дополнительного прогресса
  2. хром: [ОШИБКА: in_process_view_renderer.cc (193)] Не удалось запросить процесс GL. Вероятность тупика: 0

когда я вызываю метод

mWebView.loadUrl(url)//webview's height is 0px now
//some code change webView's height here

Моим решениям задается высота веб-просмотра, некоторая dp или match_parent по умолчанию. Работает хорошо!

0 голосов
/ 17 марта 2012

попробуйте изменить код

 public boolean shouldOverrideUrlLoading(WebView view, String url) { 
                        return true; 
        } 

Взгляните на этот учебник .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...