2013-04-22 3 views
5

私はAndroid SDKを使い始めています。私はローカルWebページだけを表示するWebViewを使って簡単なアプリケーションを作りたがっていました。私はそれを作るためにネット上で見つけた例を使用しました。WebViewで戻るボタンを有効にする

バックボタンを追加するまで、アプリはうまく動作します。電話機の戻るボタンが押されると、アプリがクラッシュします。

ここに私の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; 
    } 

} 

そして、ここでは私のactivity_main.xmlです:

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) 
:ここ

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

logcatの私のエラーです

ありがとうございます。

+0

ポストあなたのlogcatエラー下さい – wangyif2

+1

提案はsuper.onBackPressed(); OnBackPressed()の最初のステートメントである必要があります。他の部分では、finish()を呼び出すだけでアクティビティを終了することができます – Raghunandan

+0

[WebViewで戻るボタンが押された場合、前のページに戻る方法]の複製がありますか?(https://stackoverflow.com/q/6077141/6521116) ) –

答えて

13

をオンにして、キーが押されたかどうかを確認してください。戻る場合は、前のページにナビゲートしてください。あなたはactiivtyに仕上げることができます表示するには、何のWebページが存在しない場合

あなたは以下

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

編集を使用することができます。

は、XMLレイアウトでscrollviewを削除します。以下

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

編集をお試しください:2

はここで働くのサンプルです。三星ギャラクシー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

速い返答をありがとう。私はコードを交換しましたが、残念ながら、が停止しました。エラー。 Logcatは、2つのエラー表示:com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)でAND dalvik.system.NativeStart.main(ネイティブメソッド) –

+0

で をXMLでscrollviewを除去します。 webview自体をスクロールすることができます – Raghunandan

+0

これを削除してRelativeLayoutに置き換えました。私の最後のコメントは誤解されていました.logcatは多くのエラーを表示します。病気のコメントには余裕がないので、質問を更新してください。 –

関連する問題