javascript - onBackPressed 事件在 web View 中无法正常工作

标签 javascript android webview

我正在使用 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/

相关文章:

javascript - 需要使用javascript降低图像的高度

javascript - 有一个同时执行 2 个 CSS 动画的元素

java - 无法与 aSmack 4.0.2 建立新连接

android - 没有应用程序可以执行此操作

Android检测清除数据以刷新小部件

javascript - ng-show 改变 div 中的最小高度

javascript - 实习生功能测试失败后如何清理?

javascript - 阻止 Android WebView 尝试在 loadData() 上加载/捕获 CSS 等资源

swift - 如何在 webView :dragSourceActionMaskForPoint:? 中返回 WebDragSourceAction

javascript - 使用 Electron webview 发送发布请求