2011-10-17 65 views
3

我有一个包含4个不同选项卡的程序。Android:后退按钮绕过onKeyDown并关闭应用程序

其中一个选项卡是一个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视图后立即按下后退按钮,程序甚至不会访问onKeyDown。但是,如果我点击WebView中的任何链接,然后按下后退按钮,则会通过我的onKeyDown方法。

这是怎么回事?

+0

它可能是一个焦点问题。 – slayton

+0

并且任务加载网页最好在AsyncTask或Intent Service中触发,因为nwtwork条件不稳定 –

回答

4

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

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

+0

是的!这确实是一个焦点问题。谢谢。 – Gibson

相关问题