2013-04-22 21 views
5

Właśnie zaczynam z Androidem SDK. Chciałem zrobić prostą aplikację z WebView, który wyświetla tylko lokalne strony internetowe. Użyłem przykładów, które znalazłem w sieci, aby to zrobić.Włącz przycisk Wstecz w WebView

Aplikacja działa świetnie, dopóki nie doda się przycisku wstecz. Po naciśnięciu przycisku wstecz na telefonie aplikacja ulega awarii.

Oto moja 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; 
    } 

} 

I tu jest moje 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> 

Oto moje błędy w 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) 

Z góry dziękuję :)

+0

Wyślij swój błąd logcat proszę – wangyif2

+1

Sugestia super.onBackPressed(); powinno być pierwszym stwierdzeniem w OnBackPressed(). w części drugiej możesz po prostu zakończyć działanie, wywołując metodę finish() – Raghunandan

+0

Możliwy duplikat [Jak wrócić do poprzedniej strony, jeśli przycisk Wstecz jest wciśnięty w WebView?] (https://stackoverflow.com/q/6077141/6521116) –

Odpowiedz

13

Zastąp onKeyDown (params), sprawdź, czy naciśnięty przycisk jest przyciskiem Wstecz, sprawdź, czy przeglądarka internetowa może przejść do poprzedniej strony, jeśli tak to naviagate do poprzedniej strony. Jeśli nie ma strony internetowej, aby wyświetlić można zakończyć actiivty

Można użyć poniższego

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

Edycja:

Zdjąć Scrollview w układzie xml. Spróbuj poniżej

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

Edycja: 2

Oto przykład, że działa. Testowane na 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> 

główną działalność

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

Dzięki za szybką odpowiedź. Wymieniłem kod, ale nadal otrzymuję komunikat "Niestety, został zatrzymany." błąd. Logcat wyświetla dwa błędy: na com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560) i co dalvik.system.NativeStart.main (metoda podstawowa) –

+0

usunąć Scrollview w XML. przeglądarka może się przewinąć – Raghunandan

+0

Usunięty i zastąpiony przez RelativeLayout. Mój ostatni komentarz był błędny, logcat wyświetla mnóstwo błędów. Zwalniam aktualizację quoestionu, ponieważ nie ma miejsca w komentarzu. –

Powiązane problemy