2013-04-22 11 views
5

Ich beginne gerade mit dem Android SDK. Ich wollte mit WebView eine einfache App erstellen, die nur lokale Webseiten anzeigt. Ich habe Beispiele benutzt, die ich im Internet gefunden habe, um es zu machen.Schaltfläche "Zurück" in WebView aktivieren

Die App funktioniert einfach super, bis ich einen Zurück-Button hinzufügen möchte. Wenn die Zurück-Taste gedrückt wird, stürzt die App ab.

Hier ist meine 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; 
    } 

} 

Und hier ist mein 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> 

Hier sind meine Fehler 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) 

Vielen Dank im Voraus :)

+0

Post logcat Fehler bitte – wangyif2

+1

Ein Vorschlag super.onBackPressed(); sollte die erste Anweisung in OnBackPressed() sein. Im else-Teil können Sie die Aktivität einfach beenden, indem Sie finish() aufrufen. – Raghunandan

+0

Mögliches Duplikat von [Zurück zur vorherigen Seite, wenn die Zurück-Taste in WebView gedrückt wird?] (https://stackoverflow.com/q/6077141/6521116) –

Antwort

13

Aufschalten onKeyDown (params), prüfen Sie, ob die gedrückte Taste Zurück-Taste ist, prüfen, ob die Webansicht zur vorherige Seite navigieren kann, wenn so naviagate zur vorherige Seite. Wenn es keine Web-Seite ist, dass Sie die actiivty

Sie können die unten

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

bearbeiten verwenden beenden kann angezeigt werden:

Entfernen Sie die Scrollview in XML-Layout. Versuchen Sie, die unten

<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

Hier ist ein Beispiel ist, das funktioniert. Getestet auf 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

Danke für die schnelle Antwort. Ich ersetzte den Code, aber ich bekomme immer noch die " wurde gestoppt." Error. Logcat zeigt zwei Fehler: bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560) und an dalvik.system.NativeStart.main (Mutter Methode) –

+0

die Scroll in xml entfernen. webview kann selbst scrollen – Raghunandan

+0

Entfernt es und ersetzt es mit RelativeLayout. Mein letzter Kommentar war falsch, Logcat zeigt eine ganze Reihe von Fehlern. Ill aktualisieren die Quoestion mit ihnen, da es in diesem Kommentar keinen Platz gibt. –

Verwandte Themen