Android Webview - 后退按钮不起作用
Posted
技术标签:
【中文标题】Android Webview - 后退按钮不起作用【英文标题】:Android Webview - Back Button not working 【发布时间】:2013-07-01 17:41:28 【问题描述】:我有一个 web 视图,其中后退按钮不起作用并导致空指针异常。我正在使用单个活动并检查要加载的 url 的意图附加内容。打开链接的所有功能都正常,只是后退按钮不会返回到 webview 中的上一页,而是会导致 Activity 崩溃。
已编辑:将代码块更新为以下建议。仍然给出空指针异常
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)
任何帮助将不胜感激。
谢谢,
【问题讨论】:
将myWebview
声明为类变量
【参考方案1】:
WebView myWebview = (WebView) findViewById(R.id.webEngine);
应该是
myWebview = (WebView) findViewById(R.id.webEngine);
您在 if 块中声明了一个新的 WebView,然后尝试在 onBackPressed() 中引用类变量 myWebView(从未实例化)。如果您想更加确定自己始终使用类变量,也可以在所有情况下使用 this.myWebView。
【讨论】:
另外,您需要为extras == null
的情况添加一些额外的逻辑,我不确定您要在这里实现什么,但现在看来,如果 extras == null ,用户只会看到一个空的 webview。
好吧,这似乎已经解决了。只是在开始时删除 Webview。在这和戴维斯的建议之间,它现在工作正常。
如果这是解决您问题的解决方案,请标记为答案。谢谢。【参考方案2】:
对于初学者,您的 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.
从那里,您可以根据用户访问的网页更改特定设置。
【讨论】:
好的。我用了你的建议。在 mywebview.loadurl(link); 之后缺少一个右括号;我保存了它,清理了项目并运行它,仍然给出与上面相同的空指针。 哪一行抛出空指针异常?您可能需要使用MyActivity.super.onBackPressed()
而不仅仅是super.onBackPressed()
,其中MyActivity 是当前活动的名称。此外,您可能需要进行一些日志打印以确保 extras 实际上不为空。
使用上面的修改,我将 MyActivity 更改为 WebUrl,这是这个 Java 类名,还是应该是 MainActivity?它在第 41 行给出错误:
好的,有道理。当您点击后退按钮时,您是否真的有此 WebView
的浏览历史记录?我认为,尽管您有 if
声明,但此代码仍在运行,您没有可返回的浏览历史记录,因此为空指针。尝试在您的if
和== true
周围添加花括号。虽然没有必要做最后两件事。
无论有没有浏览历史,它都会给出空指针。您能否更新上面的代码块以反映建议。不知道你指的是哪里【参考方案3】:
myWebview
未正确初始化。
myWebView
在以下两个条件为真时初始化
if(extras !=null)
和
if(link.equals("http://www.google.com"))
所以不知何故,这两个条件中的任何一个都是错误的。所以变量没有初始化。结果它为空并抛出异常
【讨论】:
以上是关于Android Webview - 后退按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何在nativescript vue中处理webview上的android后退按钮
android webview和loadData,我可以让后退按钮返回生成的内容吗?
ionic5 webview 应用程序浏览器事件与 android 设备后退按钮不同步