1

戻るボタンが機能せず、nullpointer 例外が発生する Web ビューがあります。私は単一のアクティビティを使用しており、ロードする URL のインテント エクストラをチェックしています。リンクを開くのはすべて正常に機能しますが、戻るボタンだけで webview の前のページに戻らず、代わりにアクティビティがクラッシュします。

編集済み:コード ブロックを以下の提案に更新しました。それでもヌルポインタ例外が発生する

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView; 
import android.webkit.WebViewClient;

public class WebUrl extends Activity {

WebView myWebview; 

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
Bundle extras = getIntent().getExtras();

if(extras != null) {
    String link = extras.getString("url");
    WebView myWebview = (WebView) findViewById(R.id.webEngine);

    myWebview.getSettings().setJavaScriptEnabled(true);
    myWebview.getSettings().setSupportZoom(true) ; 
    myWebview.getSettings().setUseWideViewPort(true) ; 
    myWebview.getSettings().setLoadWithOverviewMode(true);
    myWebview.getSettings().setBuiltInZoomControls(true);
    myWebview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    myWebview.setScrollbarFadingEnabled(false);

    // Load the URLs inside the WebView, not in the external web browser
    myWebview.setWebViewClient(new WebViewClient());

               if (savedInstanceState == null) {
            // Load a page
            myWebview.loadUrl(link);
        }
        }
    }

 @Override
 public void onBackPressed() {
    if(myWebview.canGoBack() == true) {
        myWebview.goBack();
    } else {
        WebUrl.super.onBackPressed(); //Replace MyActivity With the name of your activity.
    }
 }
 }

Logcat エラー:

07-01 11:54:19.817: E/AndroidRuntime(10079): FATAL EXCEPTION: main
07-01 11:54:19.817: E/AndroidRuntime(10079): java.lang.NullPointerException
07-01 11:54:19.817: E/AndroidRuntime(10079):    at com.app.browser.WebUrl.onBackPressed(WebUrl.java:70)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at android.app.Activity.onKeyUp(Activity.java:2163)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at android.view.KeyEvent.dispatch(KeyEvent.java:2651)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at android.app.Activity.dispatchKeyEvent(Activity.java:2393)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1853)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3683)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3653)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2893)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at android.os.Looper.loop(Looper.java:137)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at android.app.ActivityThread.main(ActivityThread.java:5059)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at java.lang.reflect.Method.invokeNative(Native Method)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at java.lang.reflect.Method.invoke(Method.java:511)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
07-01 11:54:19.817: E/AndroidRuntime(10079):    at dalvik.system.NativeStart.main(Native Method)

どんな助けでも大歓迎です。

ありがとう、

4

3 に答える 3

3

WebView myWebview = (WebView) findViewById(R.id.webEngine);

する必要があります

myWebview = (WebView) findViewById(R.id.webEngine);

if ブロックで新しい WebView を宣言してから、onBackPressed() でクラス変数 myWebView (インスタンス化されていない) を参照しようとしています。常にクラス変数を使用していることをさらに確認したい場合は、すべての場合に this.myWebView を使用することもできます。

于 2013-07-01T19:39:28.110 に答える
1

まず、onBackPressedメソッドはクラスの外にあります。そのため、null ポインターをスローしています。私は実際にこれがコンパイルされて実行されたことに本当に驚いています。

しかし、あなたはこれを複雑にしすぎており、2 つの別々の Web ページにすべてのコードを複製する必要はありません。Google と Mozilla の設定は同じようです。この場合、次のコードを使用します。

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class WebUrl extends Activity {

    WebView myWebview;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview);
        Bundle extras = getIntent().getExtras();

        if(extras != null) {
            String link = extras.getString("url");
            WebView myWebview = (WebView) findViewById(R.id.webEngine);

            myWebview.getSettings().setJavaScriptEnabled(true);
            myWebview.getSettings().setSupportZoom(true) ; 
            myWebview.getSettings().setUseWideViewPort(true) ; 
            myWebview.getSettings().setLoadWithOverviewMode(true);
            myWebview.getSettings().setBuiltInZoomControls(true);
            myWebview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
            myWebview.setScrollbarFadingEnabled(false);

            // Load the URLs inside the WebView, not in the external web browser
            myWebview.setWebViewClient(new WebViewClient());

            if (savedInstanceState == null) {
                // Load a page
                myWebview.loadUrl(link);
            }
        }

        @Override
        public void onBackPressed() {
            if(myWebview.canGoBack() == true) {
                myWebview.goBack();
            } else {
                MyActivity.super.onBackPressed(); //Replace MyActivity With the name of your activity.
            }
        }
    }
}

そこから、ユーザーがアクセスする Web ページに基づいて特定の設定を変更できます。

于 2013-07-01T18:07:45.977 に答える