34

と がありEditTextますButton。ボタンをクリックすると、EditTextキーボードを開き、同時ににフォーカスを要求したいEditTextので、ユーザーがキーボードで直接入力を開始すると、テキストがに表示されますEditText。しかし、私の場合、ボタンをクリックするとキーボードが開きますが、EditTextユーザーがEditTextもう一度クリックして書き込む必要があるため、にフォーカスが設定されません。どうした。ヘルプや提案。

コードボタンのクリック時

m_SearchEditText.requestFocus();
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(m_SearchEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
4

14 に答える 14

54

edittext がタッチモードでフォーカス可能であることを確認してください。あなたはそれを2つの方法で行うことができます。

xml で:

android:focusableInTouchMode="true"

Javaで:

view.setFocusableInTouchMode(true);

個人的には、このパラメーターの XML 定義は信用できません。私は常に次の 2 行のコードでフォーカスをリクエストします。

view.setFocusableInTouchMode(true);
view.requestFocus();

キーボードは、InputMethodManager を呼び出さなくても表示されます。

ほとんどの場合に機能します。非常に重い処理のためにオブジェクトへの参照が失われたため、うまくいきませんでした - これがあなたの問題ではないことを確認してください。

于 2013-07-11T09:33:57.113 に答える
8

以下は私にとってはうまくいき、役立つはずです:

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
于 2013-07-11T06:05:43.060 に答える
5

この回答の延長として(評判のためにコメントとして追加しませんでした...)。

遅延時間をゼロに減らしたい場合は、代わりに handler.post() を使用してください。完全なコード:

final Handler handler = new Handler();
handler.post(new Runnable() {
    @Override
    public void run() {
        lastview.getEditText().clearFocus();
        m_SearchEditText.requestFocus();
        InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);


        mgr.showSoftInput(mLastNameET, InputMethodManager.SHOW_IMPLICIT);
    }
});
于 2016-12-29T10:51:40.623 に答える
5

システム サービスへのこの種の鈍い呼び出しは必要ないふりをする必要があるため、最小限の Kotlin 拡張バージョン:

fun EditText.requestKeyboardFocus() {
    val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
于 2018-10-09T03:26:00.837 に答える
4

これを実現するには、2 つの xml 属性も必要です。

android:focusable="true"
android:focusableInTouchMode="true"

それらを EditText と親レイアウト (これらのビューが含まれるレイアウト) に追加します。デフォルトでは、これらは false であるため、要求されたビューにフォーカスが与えられません。

ソース: https://developer.android.com/reference/android/view/View.html#attr_android:focusable

チェックボックスの選択に基づいて EditText を表示した後、次および前のフォーカス ポイントを動的にコードに追加します。

お役に立てれば。

于 2016-05-18T12:25:07.560 に答える
0

いくつかの回答を組み合わせていたところ、次の解決策が見つかりました。

fun Fragment.focusEditText(editText: EditText) {
Timer("Timer", false).schedule(50) {
    requireActivity().runOnUiThread(java.lang.Runnable {
        editText.isFocusableInTouchMode = true
        editText.requestFocus()
        val manager =
            requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        manager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
    })
}

タイマーの遅延により、フォーカス要求が機能していることと、キーボードが暗黙的に機能しなかったため、手動で開かれていることが確認されます。

于 2020-10-24T17:03:20.977 に答える