3

タブホスト内に EditText を表示しています。Tabhost は SherlockFragmentActivity 内にあります。

タッチ モードで、EditText をクリックしてフォーカスを与え、入力を開始するとします。2 ~ 3 文字入力した後、ハード キーボードを使用することにしました。最初のハード キーを押すとすぐに、タッチ モードから移動します。これにより、現在選択されているタブにフォーカスが戻ります。ハード ナビゲーション キーを使用してフォーカスを EditText に戻さない限り、EditText に入力することはできません。

この問題は、TabHost が TabActivity 内にない場合にのみ発生します。

この問題を再現する簡単なサンプル コードは、ActionBarSherlock サンプル コードの FragmentTabs アクティビティです。CustomTab を選択し、ハード キーボードを使用してアクション バーの検索ビュー内に任意のテキストを入力してみてください。フォーカスがタブに移動するだけです。

この問題は、android 2.2、4.0、および ICS エミュレーターを使用しても再現できます。

誰かもっと情報を持っていますか。この問題について?

(回避策がここに記載されているようです: https://stackoverflow.com/a/8684025/333137しかし、ハックのように見えます)

ありがとう。

編集:さらに調査したところ、TabHostがTabActivity内で使用されていない場合にのみ呼び出す必要があるTabHostクラス内のsetup()関数が見つかりました。ハードキーが押されたときだけコールバックを受け取るキーリスナーを登録します。

void setup(){
       // KeyListener to attach to all tabs. Detects non-navigation keys
        // and relays them to the tab content.
        mTabKeyListener = new OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_DPAD_CENTER:
                    case KeyEvent.KEYCODE_DPAD_LEFT:
                    case KeyEvent.KEYCODE_DPAD_RIGHT:
                    case KeyEvent.KEYCODE_DPAD_UP:
                    case KeyEvent.KEYCODE_DPAD_DOWN:
                    case KeyEvent.KEYCODE_ENTER:
                        return false;

                }
                **mTabContent.requestFocus(View.FOCUS_FORWARD);**
                return mTabContent.dispatchKeyEvent(event);
            }

requestFocus(View.FOCUS_FORWARD) を呼び出している理由はわかりませんが、これはその中の EditText にフォーカスを設定しません (そうすべきですか?)。また、アクションバーの検索ビューの場合は、完全にタブの外です。

4

1 に答える 1

15

以下のようにTabHostをオーバーライドします、それは私のために働きます。

public class TabHostExt extends TabHost {

    public TabHostExt(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TabHostExt(Context context) {
        super(context);
    }

    @Override
    public void onTouchModeChanged(boolean isInTouchMode) {
        // leave it empty here. It looks that when you use hard keyboard,
        // this method will be called and the focus will be token.
    }
}
于 2012-07-20T12:42:26.160 に答える