3

4 つの異なるタブを持つプログラムがあります。

これらのタブの 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 メソッドが通過します。

ここで何が起こっているのですか??

4

1 に答える 1

4

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

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

于 2011-10-17T15:42:19.310 に答える