Reputation: 799
Basically I have a simple webview app I'm making for a university project and I know almost nothing about coding. The webview works and loads other links still in my app as expected but the back button doesn't navigate to the previous page, it just force closes the app and a message pops up saying 'Unfortunately, 'Broadbent Studios has stopped'. If I just get rid of the code for the back button the app works fine but then I can't use the back button like you can in a web browser, which would be better.
I've tried different methods that I have on here but none have worked, this has been the best as eclipse gives no errors, but clearly something is wrong.
package com.broadbentstudios;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.view.KeyEvent;
public class BroadbentStudios extends Activity
{
final Activity activity = this;
WebView WebView;
@SuppressLint("SetJavaScriptEnabled")
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main);
WebView webView = (WebView) findViewById(R.id.mainWebView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setUseWideViewPort(true);
webView.loadUrl("http://www.bsstudios.portfoliobox.me");
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url);
return true;
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && WebView.canGoBack()) {
WebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
Logcat entry
03-06 15:20:14.757: W/UnimplementedWebViewApi(32191): Unimplemented WebView method onKeyDown called from: android.webkit.WebView.onKeyDown(WebView.java:2178)
03-06 15:20:14.757: E/InputEventSender(32191): Exception dispatching finished signal.
03-06 15:20:14.757: E/MessageQueue-JNI(32191): Exception in MessageQueue callback: handleReceiveCallback
03-06 15:20:14.757: E/MessageQueue-JNI(32191): java.lang.NullPointerException
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at com.broadbentstudios.BroadbentStudios.onKeyDown(BroadbentStudios.java:42)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.KeyEvent.dispatch(KeyEvent.java:2640)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.app.Activity.dispatchKeyEvent(Activity.java:2423)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2017)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3848)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3822)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3521)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3578)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3554)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3714)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2021)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1715)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1706)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1998)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.os.MessageQueue.nativePollOnce(Native Method)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.os.MessageQueue.next(MessageQueue.java:138)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.os.Looper.loop(Looper.java:123)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at android.app.ActivityThread.main(ActivityThread.java:5146)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at java.lang.reflect.Method.invokeNative(Native Method)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at java.lang.reflect.Method.invoke(Method.java:515)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
03-06 15:20:14.757: E/MessageQueue-JNI(32191): at dalvik.system.NativeStart.main(Native Method)
03-06 15:20:14.757: D/AndroidRuntime(32191): Shutting down VM
03-06 15:20:14.757: W/dalvikvm(32191): threadid=1: thread exiting with uncaught exception (group=0x415f9db8)
03-06 15:20:14.767: E/AndroidRuntime(32191): FATAL EXCEPTION: main
03-06 15:20:14.767: E/AndroidRuntime(32191): Process: com.broadbentstudios, PID: 32191
03-06 15:20:14.767: E/AndroidRuntime(32191): java.lang.NullPointerException
03-06 15:20:14.767: E/AndroidRuntime(32191): at com.broadbentstudios.BroadbentStudios.onKeyDown(BroadbentStudios.java:42)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.KeyEvent.dispatch(KeyEvent.java:2640)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.app.Activity.dispatchKeyEvent(Activity.java:2423)
03-06 15:20:14.767: E/AndroidRuntime(32191): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2017)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3848)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3822)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3521)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3578)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3554)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3714)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2021)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1715)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1706)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1998)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.os.MessageQueue.nativePollOnce(Native Method)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.os.MessageQueue.next(MessageQueue.java:138)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.os.Looper.loop(Looper.java:123)
03-06 15:20:14.767: E/AndroidRuntime(32191): at android.app.ActivityThread.main(ActivityThread.java:5146)
03-06 15:20:14.767: E/AndroidRuntime(32191): at java.lang.reflect.Method.invokeNative(Native Method)
03-06 15:20:14.767: E/AndroidRuntime(32191): at java.lang.reflect.Method.invoke(Method.java:515)
03-06 15:20:14.767: E/AndroidRuntime(32191): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
03-06 15:20:14.767: E/AndroidRuntime(32191): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
03-06 15:20:14.767: E/AndroidRuntime(32191): at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
03-06 15:20:14.767: E/AndroidRuntime(32191): at dalvik.system.NativeStart.main(Native Method)
Upvotes: 1
Views: 4263
Reputation: 1092
You expected to do things with your global variable (WebView WebView;
), yet had another local WebView variable (WebView webView = (WebView) findViewById(R.id.mainWebView);
) in your onCreate()
.
So modify your code like this:
public class BroadbentStudios extends Activity {
WebView webView;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main);
webView = (WebView) findViewById(R.id.mainWebView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setUseWideViewPort(true);
webView.loadUrl("http://www.bsstudios.portfoliobox.me");
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url);
return true;
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView!=null && webView.canGoBack()) {
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
I just ran the code above. I guarantee this code works ;)
Good luck ;)
Upvotes: 2