Android TextField:プログラムでフォーカスとソフト入力を設定します


81

私の見解では、EditTextを検索しており、フィールドでのクリックイベントの動作をプログラムでトリガーしたいと考えています。つまり、テキストフィールドにフォーカスを置き、必要に応じてソフトキーボードを表示します(ハードキーボードが使用できない場合)。

やってみましたfield.requestFocus()。フィールドは実際にフォーカスされますが、ソフトキーボードは表示されません。

やってみましたfield.performClick()。ただし、これはフィールドのOnClickListenerを呼び出すだけです。

何か案が ?

回答:


149

よろしくお願いします。これを試してください。

edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

よくわかりませんが、これは一部の電話(一部の古いデバイス)で必要になる場合があります。

final InputMethodManager inputMethodManager = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);

3
requestFocus()のみと同じ結果...フィールドはフォーカスを取得しますが、ソフトキーボードはトリガーされません。
sdabet 2011年

12
(の代わりに)アクティビティfield.requestFocus()onResume()メソッドを呼び出すことで、問題を最終的に解決しましたonCreate()。それは...働く理由を正確に知ってはいけない
sdabet

31
ビューは、実際に画面に配置される前にフォーカスを合わせることができません。onCreate()がUIスレッドを保持している間はこれを実行できないため、ビューはonCreate()の直後でonResume()の前にレイアウトされます。:)
pgsandstrom 2011年

@fiddlerそれはで動作するonResumeので、onResume後に呼び出されるonCreateので、fieldまでは存在しませんonCreate実行されます。ここを参照してください:developer.android.com/reference/android/app/...
ランディ・

3
素晴らしい提案、古いチャップ。私は宣言します。これは賛成に値する!
MW。

63

これが私のために働いたコードです。

edittext.post(new Runnable() {
    public void run() {
        edittext.requestFocusFromTouch();
        InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        lManager.showSoftInput(edittext, 0);
    }
});

それでおしまい!楽しい ;)


1
おかげで、これは私のために働いた。EditTextユーザーがボタンを押すと、プログラムで追加します。
dumbfingers 2013年

EditTextダイアログモーダルからを追加しました。一部のフラグはAndroidによって設定されているため、このコントロールは何のタッチも受けません。ランナブルにフィールドを追加すると、フラグは設定されません。
JeffRegan 2014

それはのように見えるInputTypeEditTextアンドロイドでnullに設定されています。を設定するとInputType、機能するはずです。
JeffRegan 2014

私にとって唯一有効な解決策(InputMethodManagerを使用してキーボードを強制的に表示する場合、それを非表示にすることはできません)
Pavel

他の方法はどれも私にはうまくいきませんでしたが、これはうまくいきました。EditTextビューをクリックするための編集行ではなく、ユーザーがクリックして編集ダイアログビューを開くためのボックスが必要でした。電話では、編集ダイアログビューが画面全体をカバーするため、編集行の機能のほとんどが失われます。そのため、ユーザーは、入力中に入力されている文字を含め、編集行を表示できません。
Androidcoder 2017年

6

次のコードは、 私のために働いた後、他の2つの答え は私のために動作しませんでした

@Override
public void onResume() {
    super.onResume();
    SingletonBus.INSTANCE.getBus().register(this);
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen
}

どこにShowKeyboardありますか

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
  //      passwordInput.requestFocusFromTouch();
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

入力が成功したら、キーボードも非表示にします

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

技術的には、ソフトキーボードの表示要求を実行する前に300ミリ秒の遅延を追加しました。変だよね?また、に変更されrequestFocus()ましたrequestFocusFromTouch()

編集:requestFocusFromTouch()それを使用しないでくださいそれはランチャーにタッチイベントを与えます。に固執しrequestFocus()ます。

EDIT2:ダイアログ(DialogFragment)で、以下を使用します

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

の代わりに

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

requestFocusFromTouch()ランチャーでタッチイベントをトリガーするようです。これは変です。
EpicPandaForce 2015年

0
        field.post(new Runnable() {
            @Override
            public void run() {
                field.requestFocus();
                field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));
            }
        });

0

私の場合、特定のテキストボックスを参照せずに仮想キーボードを表示したかったので、受け入れられた回答の最初の部分を使用して焦点合わせました

edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

次に、仮想キーボードを表示します

InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.