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

时间:2011-10-17 15:36:08

标签: 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的原始活动。

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

这里发生了什么?

1 个答案:

答案 0 :(得分:4)

您的WebView没有焦点,导致后退按钮(应用程序堆栈)被触发。如果你点击一个链接就可以得到重点关注。 WebView有一些关于焦点的奇怪问题,看看这篇文章:Android WebView focus problem

在那里你还会找到一些建议的解决方法来获得焦点,你需要在适当的地方在WebView上调用requestFocus()。