web-dev-qa-db-ja.com

スピナーがフォーカスされない

アクティビティで4つのEditTextフィールドと2つのスピナーを使用しています。これらのコンポーネントの順序は、2 EditText、2つのスピナー、2つのEditTextの順になります。

(ソフトキーボードの[次へ]ボタンを使用して)フォーカスをEditTextからスピナーに転送すると、問題が発生します。スピナーはフォーカスを取得せず、フォーカスは次のEditTextフィールドに転送されますスピナーの後に配置されます。

スピナーでrequestfocus()を使用しましたが、機能しませんでした。

スピナーが確実にフォーカスされるようにするにはどうすればよいですか?

21
Shameen

私はなんとかしてスピナーを再配置する以外の解決策を見つけました。 EditTextbeforeスピナーに、次のリスナーを追加します。

editTextBefore.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView textView, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_NEXT) {
            hideKeyboard();
            textView.clearFocus();
            spinner.requestFocus();
            spinner.performClick();
        }
        return true;
    }
});

また、フォーカスを取得するには、これらの行をスピナーに追加する必要があります。

spinner.setFocusable(true); // can be done in XML preferrable

私のhideKeyboard関数は、キーボードを非表示にするために追加したい視覚的な詳細でした:

private void hideKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),
            InputMethodManager.HIDE_NOT_ALWAYS);
}

私はこのトリッキーな質問を手伝ってくれたことを願っています。
フラグInputMethodManager.HIDE_NOT_ALWAYSドキュメントにあります です。

41

おかげで、私は次のようにして解決しました:

  1. 私のコードが最初に実行されることを確認するために、Spinnerオブジェクトを(onCreateメソッド内で)上に設定しました
  2. 私は以下を使用しました:

    Spinner s1 = (Spinner) findViewById(R.id.spinner1); 
    s1.setFocusable(true); 
    s1.setFocusableInTouchMode(true);
    s1.requestFocus();
    
19
Shameen

これは暗闇の中でのショットですが、スピナーでfocusableプロパティを(XMLまたはコードで、どのように行っていても)trueに設定してみてください。

http://developer.Android.com/reference/Android/view/View.html#attr_Android:focusable

編集:また、この質問を参照してください: リクエストフォーカススピナーを管理できません

6
shanet