2013-04-22 27 views
5

Sto appena iniziando con l'SDK di Android. Volevo creare una semplice app con WebView che visualizza solo pagine Web locali. Ho usato degli esempi che ho trovato sulla rete per realizzarlo.Abilita il pulsante Indietro in WebView

L'app funziona alla grande, fino a quando non voglio aggiungere un pulsante indietro. Quando viene premuto il pulsante di protezione del telefono, l'app si arresta in modo anomalo.

Ecco il mio 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; 
    } 

} 

E qui è la mia 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> 

Qui ci sono i miei errori in 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) 

Grazie in anticipo :)

+0

Inserisci errore logcat prega – wangyif2

+1

Un suggerimento super.onBackPressed(); dovrebbe essere la prima dichiarazione in OnBackPressed(). nella parte opposta è possibile terminare l'attività chiamando finish() – Raghunandan

+0

Possibile duplicato di [Come tornare alla pagina precedente se si preme il pulsante Indietro in WebView?] (https://stackoverflow.com/q/6077141/6521116) –

risposta

13

Ignora onKeyDown (params), controlla se il tasto premuto è indietro pulsante, controlla se la webview può navigare alla pagina precedente, in caso affermativo naviagate alla pagina precedente. Se non c'è pagina web per visualizzare si può finire l'actiivty

È possibile utilizzare il sottostante

@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); 
} 

Edit:

Rimuovere lo ScrollView nel layout xml. Prova il seguito

<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> 

Edit: 2

Ecco un esempio che funziona. Testato su 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> 

MainActivity

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); 
} 
} 
+0

Grazie per la risposta veloce. Ho sostituito il codice, ma ottengo ancora il messaggio "Purtroppo, si è interrotto". errore. Logcat mostra due errori: a com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560) e dalvik.system.NativeStart.main (metodo natale) –

+0

rimuovere ScrollView in XML. WebView può scorrere se stesso – Raghunandan

+0

Rimosso e sostituito con RelativeLayout. Il mio ultimo commento è stato errato, logcat mostra un sacco di errori. Ill aggiorno il problema con loro perché non c'è spazio nel tuo commento .. –

Problemi correlati