Android:后退按钮绕过 onKeyDown 并关闭应用程序

标签 android button webview back onkeydown

我有一个包含 4 个不同选项卡的程序。

其中一个选项卡是一个 ActivityGroup,其中有一个 ListView。当我单击其中一个列表项时,它会切换到 WebActivity:

        lv.setOnItemClickListener(new OnItemClickListener() {
          public void onItemClick(AdapterView<?> parent, View view,
              int position, long id) {
              Intent intent = new Intent(TabActivity2.this, WebActivity.class);
              Bundle b = new Bundle();
              b.putString("URL", URLs[(int)id]);
              b.putString("prevActivity", "TabActivity2");
              intent.putExtras(b);
              replaceContentView("web", intent);
          }
        });
    }

    public void replaceContentView(String id, Intent newIntent) {
        View view = getLocalActivityManager().startActivity(id,newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView(); this.setContentView(view);
    }

所以现在我们在 WebActivity 类中。这是代码:

public class WebActivity extends ActivityGroup {
    WebView mWebView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web);

        Bundle b = getIntent().getExtras();
        String URL = b.getString("URL");

        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setPluginsEnabled(true);
        mWebView.loadUrl(URL);

        mWebView.setWebViewClient(new FirstTabWebViewClient());        
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        Bundle b = getIntent().getExtras();
        String retActivity = b.getString("prevActivity");
        if (retActivity == "TabActivity2") {
            Intent intent = new Intent(WebActivity.this, TabActivity2.class);
            replaceContentView("list_webpages", intent);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    public void replaceContentView(String id, Intent newIntent) {
        View view = getLocalActivityManager().startActivity(id,newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView(); this.setContentView(view);
    }

奇怪的是:如果我在进入 WebActivity 类后立即单击后退按钮,它会关闭应用程序。

但是,如果我首先单击 WebView 中的任何链接,然后按两次返回,它会返回到 ListView 的原始 Activity 。

通过在 Eclipse 中使用断点,我发现如果我在进入 WebActivity View 后立即按下返回按钮,程序甚至不会访问 onKeyDown。但是,如果我单击 WebView 中的任何链接,然后按下后退按钮,它就会通过我的 onKeyDown 方法。

这是怎么回事??

最佳答案

您的 WebView 没有焦点,这会导致在其(应用程序堆栈)之上触发后退按钮。如果您单击一个链接,它会获得后焦点。 WebView 有一些关于焦点的奇怪问题,看看这个帖子:Android WebView focus problem

在那里您还会找到一些建议的变通方法来获得焦点,您需要在 WebView 的正确位置调用 requestFocus()。

关于Android:后退按钮绕过 onKeyDown 并关闭应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7796097/

相关文章:

android - android webview 上一页的后退按钮不起作用

java - 如何使用 pires OBD-II Java API 中的 ObdRawCommand 发送自定义命令

java - 在 Java Swing 中给按钮预设 "Style"

javascript - JS暂时停止click()的进度

android - 无论屏幕大小如何,都将两个按钮设置为相同宽度?

c++ - 如何重置 QML WebView?

c# - 如何将 css 关联到从服务器接收到的 html 字符串?

java - 通知数据从一项 Activity 更改为另一项 Activity

Android自定义字体问题

java - Android 中的 youtube-dl