0

我的 android 应用程序有一个可点击的欢迎页面,它通向一个带有多个图标的 web 视图。当我单击图标时,它会打开一个 HTML 文件,该文件存储在 assets 文件夹中。同样,单击其他图标会导致在同一 webview 实例中打开 HTML 资源。我的问题是,如果假设我在第三级导航并且我按下 android 设备后退按钮,我会回到欢迎页面(第一级导航)。如果我在第三级导航中按下后退按钮,我如何才能进入所有页面图标都存在的第二级导航。我的二级导航代码如下:

public class Home extends Activity {



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        WebView webview = (WebView) findViewById(R.id.webView1);
       webview.loadUrl("file:///android_asset/webpages/index.html");
       webview.getSettings().setBuiltInZoomControls(true);
       webview.getSettings().setSupportZoom(true);
       webview.getSettings().setJavaScriptEnabled(true);
    }


}

index.html 包含用于导航到不同页面的图标,例如contact.html、feedback.html,如果假设我在contact.html 中并且我按下android 上的后退按钮,我应该到达index.html 而不是我的应用程序的第一个屏幕。

@Zyber 我是 java 和 android 开发的新手。我试过你的建议,但是当我按下后退按钮时,我得到强制关闭错误。我的代码如下:

 public class Home extends Activity {

    private WebView webview;

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

                    webview.goBack();

            return true;
        }

        return super.onKeyDown(keyCode, event);
    }




    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        WebView webview = (WebView) findViewById(R.id.webView1);
       webview.loadUrl("file:///android_asset/webpages/index.html");
       webview.getSettings().setBuiltInZoomControls(true);
       webview.getSettings().setSupportZoom(true);
       webview.getSettings().setJavaScriptEnabled(true);

    }


}

我的 logcat 代码如下:

0-02 19:01:07.536: E/AndroidRuntime(4160): FATAL EXCEPTION: main
10-02 19:01:07.536: E/AndroidRuntime(4160): java.lang.NullPointerException
10-02 19:01:07.536: E/AndroidRuntime(4160):     at com.summit.mpidc.Home.onKeyDown(Home.java:21)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at android.view.KeyEvent.dispatch(KeyEvent.java:2553)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at android.app.Activity.dispatchKeyEvent(Activity.java:2329)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1825)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3340)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at android.view.ViewRootImpl.handleFinishedEvent(ViewRootImpl.java:3313)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2473)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at android.os.Looper.loop(Looper.java:137)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at android.app.ActivityThread.main(ActivityThread.java:4424)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at java.lang.reflect.Method.invokeNative(Native Method)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at java.lang.reflect.Method.invoke(Method.java:511)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
10-02 19:01:07.536: E/AndroidRuntime(4160):     at dalvik.system.NativeStart.main(Native Method)

编辑代码:

public class Home extends Activity {


    private WebView webview;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        WebView webview = (WebView) findViewById(R.id.webView1);
       // WebView webview = new WebView(this);
       // setContentView(webview);

       webview.loadUrl("file:///android_asset/webpages/index.html");
       webview.getSettings().setBuiltInZoomControls(true);
       webview.getSettings().setSupportZoom(true);
       webview.getSettings().setJavaScriptEnabled(true);
       webview.getSettings().setUseWideViewPort(true);
       webview.setInitialScale(1);
       webview.canGoBack();

    }

    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack())
        {
            webview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }



}

我收到空指针异常。

4

1 回答 1

0

如果我对您的理解正确,您可以尝试覆盖该onKeyDown功能并对后退按键做出反应。

WebView webview;
public void onCreate(...)
{
    ...
    webview = (WebView) findViewById(...);
    ...
}    

public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack())
    {
        webview.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

这将在您按下后退键时拦截,如果您的 webview 有历史记录,它将在历史记录中后退一步。如果您在加载的第一页并按回,它将终止 webview 活动并返回到您的欢迎活动。

编辑:

是的,你也可以使用onBackPressed,我想它会更合适。正如 njzk2 所指出的,另一种方法是。

@Override
public void onBackPressed()
{
    if(mWebView.canGoBack())
    {
        mWebView.goBack();          
    }
    else
    {
        super.onBackPressed();
    }
}
于 2012-10-02T13:07:55.713 回答