我正在使用 webview 开发一个 Android 应用程序。单击按钮后,它会导航到其他页面。我使用 javascript 函数 onClick()
进行导航。按下后退按钮时,它用于关闭该应用程序,但我希望它导航到上一页。使用以下代码后,它指出“不幸的是,myapp 停止工作”。我尝试了所有可能的方法。请帮助我
package com.example.anush.teamcetrankevaluator;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebView;
public class MainActivity extends Activity {
WebView web;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView web=(WebView)this.findViewById(R.id.webview);
web.loadUrl("file:///android_asset/webview.html");
web.getSettings().setJavaScriptEnabled(true);
//web.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (web.canGoBack()) {
web.goBack();
}
else
{
super.onBackPressed();
finish();
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
// finish the activity
if (keyCode == KeyEvent.KEYCODE_BACK && web.canGoBack()) {
web.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
Logcat 错误:
09-10 20:44:52.688 10542-10542/? D/AndroidRuntime﹕ Shutting down VM
09-10 20:44:52.690 10542-10542/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.anush.teamcetrankevaluator, PID: 10542
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.webkit.WebView.canGoBack()' on a null object reference
at com.example.anush.teamcetrankevaluator.MainActivity.onKeyDown(MainActivity.java:65)
at android.view.KeyEvent.dispatch(KeyEvent.java:2622)
at android.app.Activity.dispatchKeyEvent(Activity.java:2714)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2221)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3988)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3950)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3509)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3562)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3528)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3638)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3536)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3695)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3509)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3562)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3528)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3536)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3509)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3562)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3528)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3671)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3832)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2210)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1851)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1842)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2187)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:143)
at android.os.Looper.loop(Looper.java:122)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
09-10 20:44:54.495 10542-10542/? I/Process﹕ Sending signal. PID: 10542 SIG: 9
最佳答案
编辑你的 onBackPressed 使其看起来像这样:
@Override
public void onBackPressed() {
// get rid of this --> super.onBackPressed();
if (web.canGoBack()) {
web.goBack();
}
else
{
super.onBackPressed();
// get rid of this --> finish();
}
}
您在 onCreate 中也遇到了错误:
WebView web;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// this line is wrong: WebView web=(WebView)this.findViewById(R.id.webview);
//should be:
web=(WebView)this.findViewById(R.id.webview);
web.loadUrl("file:///android_asset/webview.html");
web.getSettings().setJavaScriptEnabled(true);
//web.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
}
这一行是 logcat 错误的有用部分:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.webkit.WebView.canGoBack()' on a null object reference
这意味着 web 为 null,但您正在尝试执行 web.canGoBack();
关于javascript - onBackPressed 事件在 web View 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32505633/