我有一个webview,其中后退按钮不起作用并导致nullpointer异常。我正在使用单个活动并检查要加载的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)
任何帮助都将不胜感激。
谢谢,
答案 0 :(得分:3)
WebView myWebview = (WebView) findViewById(R.id.webEngine);
应该是
myWebview = (WebView) findViewById(R.id.webEngine);
您在if块中声明了一个新的WebView,然后尝试在onBackPressed()中引用类变量myWebView(它从未实例化)。如果你想要更加确定你总是使用类变量,你也可以在所有情况下使用this.myWebView。
答案 1 :(得分:1)
对于初学者,您的onBackPressed
方法不在课堂上。这就是它抛出空指针的原因。实际上,即使编译也跑了,我真的很惊讶。
但是你要比较复杂,你不需要为两个单独的网页复制所有代码。看起来您对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.
}
}
}
}
从那里,您可以根据用户访问的网页更改特定设置。
答案 2 :(得分:0)
myWebview
未正确初始化。
myWebView
正在初始化
if(extras !=null)
和
if(link.equals("http://www.google.com"))
所以这两种情况中的任何一种都是错误的。所以变量不是初始化的。因此,它为null并抛出异常