了解android中使用WebView的onBackPressed方法

了解android中使用WebView的onBackPressed方法,android,android-webview,onbackpressed,Android,Android Webview,Onbackpressed,请有人帮我理解。我正在使用android studio构建一个简单的WebView应用程序,并使用override方法onBackPressed()使功能在有人按下后退按钮时返回。不幸的是,我的应用程序关闭时出现错误“应用程序已停止工作”,同时android studio也显示了一些运行时错误。我的代码如下:- 这两者都不起作用: @Override public void onBackPressed() { if (view.canGoBack()) { vi

请有人帮我理解。我正在使用android studio构建一个简单的
WebView
应用程序,并使用override方法
onBackPressed()
使功能在有人按下后退按钮时返回。不幸的是,我的应用程序关闭时出现错误“应用程序已停止工作”,同时android studio也显示了一些运行时错误。我的代码如下:- 这两者都不起作用:

@Override
public void onBackPressed() 
{
    if (view.canGoBack())
    {
        view.goBack();
    } else
    {
        //otherwise exit my app
        super.onBackPressed();
    }
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
    view.goBack();
    return true;
}

return super.onKeyDown(keyCode, event);
}
这也不起作用:

@Override
public void onBackPressed() 
{
    if (view.canGoBack())
    {
        view.goBack();
    } else
    {
        //otherwise exit my app
        super.onBackPressed();
    }
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
    view.goBack();
    return true;
}

return super.onKeyDown(keyCode, event);
}
我不知道怎么了,请有人澄清我的观点

更新:当我在emulator中运行我的应用程序时,它工作正常,但当我单击设备上的“后退”按钮时,它应该返回到上一页,而不是停止工作。设备中的错误显示为“不幸的是,appname已停止工作”,android studio中的错误消息如下:-

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: pk.shippingexpress.shippingexpress, PID: 1996
              java.lang.NullPointerException
                  at pk.shippingexpress.shippingexpress.MainActivity.onBackPressed(MainActivity.java:42)
                  at android.app.Activity.onKeyUp(Activity.java:2193)
                  at android.view.KeyEvent.dispatch(KeyEvent.java:2664)
                  at android.app.Activity.dispatchKeyEvent(Activity.java:2423)
                  at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:547)
                  at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
                  at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:319)
                  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962)
                  at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3852)
                  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
                  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
                  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
                  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
                  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
                  at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
                  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
                  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
                  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
                  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
                  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
                  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3558)
                  at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3718)
                  at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2010)
                  at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1704)
                  at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1695)
                  at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1987)
                  at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
                  at android.os.MessageQueue.nativePollOnce(Native Method)
                  at android.os.MessageQueue.next(MessageQueue.java:138)
                  at android.os.Looper.loop(Looper.java:123)
                  at android.app.ActivityThread.main(ActivityThread.java:5017)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:515)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                  at dalvik.system.NativeStart.main(Native Method) 
my MainActivity.java的完整代码如下:-

package pk.shippingexpress.shippingexpress;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;

public class MainActivity extends AppCompatActivity {

    public WebView view;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String url = "http://easyonlineconverter.com";
        WebView view = (WebView) this.findViewById(R.id.express);
        view.getSettings().setJavaScriptEnabled(true);
        view.loadUrl(url);
        view.setWebViewClient(new WebViewClient());

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }
    @Override
public void onBackPressed() 
{
    if (view.canGoBack())
    {
        view.goBack();
    } else 

    {
        //otherwise exit my app
        super.onBackPressed();
    }
}


    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    public Action getIndexApiAction() {
        Thing object = new Thing.Builder()
                .setName("Main Page") // TODO: Define a title for the content shown.
                // TODO: Make sure this auto-generated URL is correct.
                .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
                .build();
        return new Action.Builder(Action.TYPE_VIEW)
                .setObject(object)
                .setActionStatus(Action.STATUS_TYPE_COMPLETED)
                .build();
    }

    @Override
    public void onStart() {
        super.onStart();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client.connect();
        AppIndex.AppIndexApi.start(client, getIndexApiAction());
    }

    @Override
    public void onStop() {
        super.onStop();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        AppIndex.AppIndexApi.end(client, getIndexApiAction());
        client.disconnect();
    }
}
再次检查这一行中的内容。我使用完全相同的代码,并且工作没有问题

@Override
public void onBackPressed() {
    if (webView.canGoBack()) {
        webView.goBack();
    } else {
        super.onBackPressed();
    }
}

首先声明一个类变量:

    public WebView view;
    WebView view = (WebView) this.findViewById(R.id.express);
但随后您初始化了一个局部变量,该局部变量无意中遮挡了类变量:

    public WebView view;
    WebView view = (WebView) this.findViewById(R.id.express);
所以当你到这条线的时候

    if (view.canGoBack())
视图
为空

将另一行更改为

    view = (WebView) this.findViewById(R.id.express);

要获得正确的操作。

错误请…请显示studio错误消息。如果没有错误,我可以说:第二种方法没有意义,因为它与键盘相关,所以您可以忽略它。在您的第一段代码中,检查您的视图是否为空。我已更新了我的问题,请有人回答我,我正在等待有人帮助我。谢谢克里斯·拉森您的代码为我工作,我感谢所有帮助我的人。虽然我是新来的,但我觉得事情很难解决。无论如何,谢谢大家。如果这个答案对你有用,请接受它为正确答案。拉尔森先生,请给我一点时间“尽快”。abbos@gmail.com“你解释得很清楚。我很高兴看到你的电子邮件。