Android:フォーカスがEditTextにあるときにソフトキーボードを自動的に表示する


Answers

キーボードを使用するために:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

キーボードの使用を隠すために:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(),0); 
Question

AlertDialogを使って入力ボックスをAlertDialogます。 AlertDialog.show()を呼び出すと、ダイアログ内のEditTextが自動的にフォーカスされますが、ソフトキーボードは自動的に表示されません。

ダイアログが表示されたらソフトキーボードが自動的に表示されるようにするにはどうすればよいですか? (物理的/ハードウェアキーボードはありません)。 検索ボタンを押してグローバル検索を呼び出すのと同様に、ソフトキーボードが自動的に表示されます。




<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

または

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);



キーボードを見せるために、私のために、私は次のことをしなければならなかった

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

本質的に解決策は以下の通りです

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

ShowKeyboardはどこですかShowKeyboard

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        //passwordInput.requestFocusFromTouch(); //this gives touch event to launcher in background -_-
        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);



まあ、これはかなり古い投稿ですが、まだ追加するものがあります。
これらは、私がキーボードを制御し続けるのに役立つ2つの簡単な方法で、完全に機能します。

キーボードを表示する

public void showKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.showSoftInput(v, 0);
}

キーボードを隠す

public void hideKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}



手動でIMEを隠して表示するthisディスカッションを見てください。 ただし、 OnCreate()やスクリーンが実際に表示される前に呼び出される他のメソッドでAlertDialog.show()を呼び出しているため、フォーカスを当てられたEditTextがIMEを起動していないとAlertDialog.show()ます。 それをOnPostResume()移動すると、私はそれを解決するはずです。




この問題は、最初にテキストを入力する場所が隠れているため、AlertDialogはWindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IMフラグまたはWindowManager.LayoutParams.FLAG_NOT_FOCUSABLEフラグを自動的に設定して、ソフト入力をトリガーしないようにしているようです表示する。

これを修正するには、次の行を追加します。

(...)
// Create the dialog and show it
Dialog dialog = builder.create()
dialog.show();

// After show (this is important specially if you have a list, a pager or other view that uses a adapter), clear the flags and set the soft input mode
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);



私は同じ問題を抱え、次のコードで解決しました。 私はそれがハードウェアキーボードを備えた電話機でどのように動作するのか分からない。

// TextEdit
final EditText textEdit = new EditText(this);

// Builder
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Enter text");
alert.setView(textEdit);

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        String text = textEdit.getText().toString();
        finish();
    }
});

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        finish();
    }
});

// Dialog
AlertDialog dialog = alert.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
    }
});

dialog.show();



誰かが取得している場合:

アクティビティのタイプから静的でないメソッドgetSystemService(String)への静的参照を作成できません

getSystemService呼び出しにコンテキストを追加してみてください。

そう

InputMethodManager imm = 
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);



なぜこの答え - 上記のソリューションはあなたのキーボードを表示しますが、他のどこかをクリックすると消えません。 EditTextがフォーカスを失ったときにEditText消すには、何かをする必要があります。

これを達成するには、次の手順を実行します。

  1. 次の属性を追加して、親ビュー(アクティビティのコンテンツビュー)をクリック可能かつフォーカス可能にします

        android:clickable="true" 
        android:focusableInTouchMode="true" 
    
  2. hideKeyboard()メソッドを実装する

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_IMPLICIT_ONLY );
        }
    
  3. 最後に、あなたのedittextのonFocusChangeListenerを設定します。

        edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    hideKeyboard(v);
                }
            }
        });