veo - no se ve el diseño android studio
Al abrir una nueva actividad de Android con una vista web, se muestra una pantalla en blanco(blanca) en lugar del contenido html. (10)
¡He estado investigando durante 2 días y no he encontrado un problema similar en ninguna parte de Internet!
Desde la actividad principal, estoy intentando abrir una nueva actividad que contiene una vista web que mostrará una página html (about.html) en la carpeta android_asset.
Puedo iniciar la nueva actividad (test.java) con la vista web correctamente mostrada, pero el contenido de la página web simplemente no se muestra. Incluso se muestra la barra de desplazamiento vertical de webview (ya que el contenido de la página es relativamente largo) y puedo desplazar la página hacia arriba y hacia abajo, ¡pero sin contenido!
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);
}
}
Lo extraño es que la nueva actividad (test.java) puede obtener y mostrar con éxito el título de la página web en la vista de texto cuando llamo webview.gettitle () pero el contenido html simplemente no se representa en la vista web. Todo lo que veo es una pantalla en blanco con barras de desplazamiento. Sospecho que es el booleano "shouldOverrideUrlLoading" lo que podría estar causándolo.
Actualizar:
Gracias por responder.
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 es tan simple como lo que está abajo.
<!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>
Ah, sí, y olvidé mencionar antes que con el mismo código, el about.html a veces se mostraría si me detengo y reinicio la aplicación en mi teléfono. Sin embargo, entonces no aparecería en lanzamientos posteriores. En ocasiones, cuando aparece con éxito about.html y presiono el botón Atrás para volver a la actividad principal, desaparecerá de nuevo cuando vuelva a iniciar la actividad desde la actividad principal. Estoy perdido, pero tengo la fuerte sensación de que no debería hacerlo "debería superarse la carga de carga".
Necesita devolver verdadero en el método shouldOverrideUrlLoading
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
Actualicé la semana pasada de 2.3.4 a 4.0 en mi HTC Sensation. Las dos aplicaciones que escribí tenían un sitio de contacto HTML local. En 2.3 funcionó bien, ahora obtengo un sitio "Página web no disponible".
Encontré otra publicación aquí en este sitio con el comentario: "A través de una discusión con un ingeniero de Google, parece que han tomado la decisión de que el esquema de archivo: // es inseguro".
Consulte aquí la solución: Android 4.0.1 rompe el almacenamiento local de WebView HTML 5.
Agregue la siguiente línea en su actividad que contiene la actividad de WebView android:hardwareAccelerated="false"
espero que ayude
No intentes cargar la url dada en shouldOverrideUrlLoading
, y tampoco devuelvas la verdad en tu caso. Realmente, por lo que parece que estás tratando de hacer, no deberías anularlo en absoluto.
Devolviendo verdadero desde shouldOverrideUrlLoading
indica a WebView que no debe cargar la URL especificada. Es probable que lo que esté haciendo, al decirle a WebView que comience a cargarlo nuevamente, cause algún tipo de bucle interno dentro de la WebView, por lo que supongo que es por eso que está viendo un comportamiento extraño.
Prueba este cambio en tu 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>
Puede ser que fuera debido a la aceleración del hardware.
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
trabajó para mi.
https://developer.android.com/guide/topics/graphics/hardware-accel.html
Puedo dar la otra manera de resolver este problema. Simplemente copie el archivo de activos en la ruta de datos "/data/data/org.test.test/" y cárguelo en WebView
de la siguiente manera.
String strHTMLFilePath = "file:///data/data/org.test.test/Files/help_android.html";
webView.loadUrl(strHTMLFilePath);
Use el siguiente código para copiar el archivo HTML del activo a la ruta de datos
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) {
}
}
Utilizar esta
browser_rn.loadDataWithBaseURL(url);
en lugar de
browser_rn.loadUrl("file:///android_asset/about.html");
intenta cambiar tu código
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return true;
}
Echa un vistazo a este tutorial .
resolver el mismo problema
He intentado las soluciones en el link . Falló todo el tiempo.
Mi situación es la misma. Hay video H5 en webview, lo hace bien la primera vez y luego falla. cuando falla, encontré algún mensaje del registro
- onProgressChanged y no al 100% sin más progreso
- cromo: [ERROR: in_process_view_renderer.cc (193)] Error al solicitar el proceso de GL. Punto muerto probable: 0
cuando invoco metodo
mWebView.loadUrl(url)//webview''s height is 0px now
//some code change webView''s height here
Mis soluciones están configuradas para webview height dp o match_parent por defecto. ¡Funciona bien!