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.

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 🙂

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); } } 
  • Escáner de código de barras ZXing para Webapps
  • Uso de navigator.geolocation.getCurrentPosition en WebView en Android 2.0+ (relacionado con PhoneGap)
  • Inicio y fin de solicitudes de registro HTTP desde WebView incorporado de Android
  • Colocación de contenido HTML en dos columnas dentro de WebView
  • Mostrar círculo de actividades antes de cargar la vista web - Android
  • Capas dentro de un HTML dentro de una webview
  • Cómo configurar el tamaño de texto en WebView en android
  • ¿Cookies compartidas entre WebView y HTTPClient?
  • Advertencia SSL de google play
  • No se puede eliminar la imagen en div contenteditable en Android
  • Android: cómo agregar un teclado virtual personalizado cuando se selecciona el campo de formulario en WebView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.