Habilitar el botón Atrás en WebView
Estoy empezando con el SDK de Android. Quería hacer una aplicación sencilla con WebView que sólo muestra páginas web locales. He utilizado ejemplos que he encontrado en la red para hacerlo.
La aplicación funciona muy bien, hasta que quiera añadir un botón de retroceso. Cuando se pulsa el botón de retroceso del teléfono, la aplicación se bloquea.
- Forzar el no-flash Vimeo incrustar o deshabilitar Flash en un WebView?
- ShouldInterceptRequest en Android 4.4 KitKat
- ¿Qué significa "enable DOM storage API"?
- Soporte de SVG en Android
- La descarga de WebView abre la ventana del navegador por un breve momento antes de volver a WebView
Aquí está mi MainActivity.java
package com.hspd.avhor; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends Activity { WebView wv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView wv = (WebView)findViewById(R.id.hspd_webview); wv.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url){ view.loadUrl(url); return true; } }); wv.loadUrl("file:///android_asset/one.htm"); } @Override public void onBackPressed() { if(wv.canGoBack()) wv.goBack(); else super.onBackPressed(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
Y aquí está mi activity_main.xml :
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <WebView android:id="@+id/hspd_webview" android:layout_width="match_parent" android:layout_height="wrap_content" /> </ScrollView>
Estos son mis errores en logcat :
04-22 17:48:06.953: W/dalvikvm(799): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 04-22 17:48:06.972: E/AndroidRuntime(799): FATAL EXCEPTION: main 04-22 17:48:06.972: E/AndroidRuntime(799): java.lang.NullPointerException 04-22 17:48:06.972: E/AndroidRuntime(799): at com.hspd.avhor.MainActivity.onKeyDown(MainActivity.java:41) 04-22 17:48:06.972: E/AndroidRuntime(799): at android.view.KeyEvent.dispatch(KeyEvent.java:2609) 04-22 17:48:06.972: E/AndroidRuntime(799): at android.app.Activity.dispatchKeyEvent(Activity.java:2375) 04-22 17:48:06.972: E/AndroidRuntime(799): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1847) 04-22 17:48:06.972: E/AndroidRuntime(799): at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3701) 04-22 17:48:06.972: E/AndroidRuntime(799): at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3651) 04-22 17:48:06.972: E/AndroidRuntime(799): at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2818) 04-22 17:48:06.972: E/AndroidRuntime(799): at android.os.Handler.dispatchMessage(Handler.java:99) 04-22 17:48:06.972: E/AndroidRuntime(799): at android.os.Looper.loop(Looper.java:137) 04-22 17:48:06.972: E/AndroidRuntime(799): at android.app.ActivityThread.main(ActivityThread.java:5041) 04-22 17:48:06.972: E/AndroidRuntime(799): at java.lang.reflect.Method.invokeNative(Native Method) 04-22 17:48:06.972: E/AndroidRuntime(799): at java.lang.reflect.Method.invoke(Method.java:511) 04-22 17:48:06.972: E/AndroidRuntime(799): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-22 17:48:06.972: E/AndroidRuntime(799): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 04-22 17:48:06.972: E/AndroidRuntime(799): at dalvik.system.NativeStart.main(Native Method)
Gracias por adelantado 🙂
- Desplazamiento de Webview dentro de una vista de desplazamiento
- Android webview tiene borde blanco alrededor de él y cómo puedo deshacerme de él?
- Android, Webview, obtener datos de formulario enviados
- Framework7 dentro de páginas de webview que no se cargan
- Android: mostrar / ocultar fragmento deja un área vacía
- Android - epub reader para leer archivos .epub ..
- Android cómo mostrar PopupMenu en webview como GMail
- WebView con Flash en un dispositivo 3.1 con la aplicación 2.2
Anula onKeyDown (params), comprueba si la tecla presionada es el botón back, comprueba si la webview puede navegar a la página anterior, si es así naviagate a la página anterior. Si no hay página web para mostrar, puede terminar el actiivty
Puedes usar el siguiente
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { //if Back key pressed and webview can navigate to previous page webView.goBack(); // go back to previous page return true; } else { finish(); // finish the activity } return super.onKeyDown(keyCode, event); }
Editar:
Quite la vista de desplazamiento en el diseño xml. Prueba lo siguiente
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/wv"></WebView> </LinearLayout>
Editar: 2
Aquí hay una muestra que funciona. Probado en samsung galaxy s3
Activtiy_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:id="@+id/wv"/> </RelativeLayout>
Actividad principal
public class MainActivity extends Activity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.wv); webView.getSettings().setJavaScriptEnabled(true); webView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { MainActivity.this.setProgress(progress * 1000); } }); webView.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(MainActivity.this, "Oh no! " + description, Toast.LENGTH_SHORT).show(); } }); webView.loadUrl("http://slashdot.org/"); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { webView.goBack(); return true; } else { finish(); } return super.onKeyDown(keyCode, event); } }
- Framebuffer FBO render a la textura es muy lento, con OpenGL ES 2.0 en Android, ¿por qué?
- Problema con la cámara androide y seguridad de hilo