2011-10-17 9 views
3

私は4つのタブを持つプログラムを持っています。Android:戻るボタンはonKeyDownをバイパスし、アプリケーションを閉じます

これらのタブの1つは、ListViewを持つActivityGroupです。リスト項目の1つをクリックすると、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内のリンクを最初にクリックしてから2回押すと、ListViewで元のアクティビティに戻ります。

Eclipseでブレークポイントを使用することから、WebActivityビューに入った直後に[戻る]ボタンを押すと、プログラムがonKeyDownにもアクセスしないことがわかりました。ただし、WebView内のリンクをクリックしてから戻るボタンを押すと、onKeyDownメソッドが実行されます。

ここでは何が起こっていますか?

+0

これは重大な問題になる可能性があります。 – slayton

+0

タスクのロード中のWebページは、nwtwork条件が不安定であるため、AsyncTaskまたはIntent Serviceでトリガする方が良い –

答えて

4

WebViewにフォーカスがないため、戻るボタンがその上(アプリケーションスタック)でトリガーされます。リンクをクリックすると、フォーカスが得られます。 WebViewにフォーカスに関するいくつかの奇妙な問題があります。この記事を見てください。Android WebView focus problem

また、フォーカスを得るためのいくつかの推奨される回避策があります。適切な場所のWebViewでrequestFocus()を呼び出す必要があります。

+0

はい!それは実際にフォーカスの問題であることが判明しました。ありがとうございました。 – Gibson

関連する問題