web-dev-qa-db-ja.com

ダイアログにソフトキーボードを表示

Edittextビューでダイアログを表示しています。ただし、ユーザーが編集ビュー内を押した場合にのみ、ソフトキーボードが開きます。そこで、次のコードでInputMethodManagerを呼び出してみました。

InputMethodManager imm =
 (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(dialogField,0);

DialogFieldは入力フィールドです。しかし、いつこれを行うべきなのでしょうか?ダイアログのonStart()メソッドで試しましたが、何も起こりません。以前にdialogFieldのフォーカスを要求しようとしましたが、何も変わりません。

私もこのコードを試しました

dialogField.setOnFocusChangeListener(new View.OnFocusChangeListener()
{
    public void onFocusChange (View v, boolean hasFocus)
    {
        if (hasFocus)
        {
            Main.log("here");
            dialogInput.getWindow().setSoftInputMode(
              WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            /*
                InputMethodManager mgr =
                  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                mgr.showSoftInput(dialogField,0);
            */
        }
    }
});

両方のバージョンで。ただし、ソフトキーボードは表示されません。 Main.logは単なるログであり、関数が実際に呼び出されることを示しています。そして、はい、それは呼ばれます。

ダイアログが開く前に、SHOW_FORCEDフラグを使用してキーボードを取得できました。しかし、それは終了時に閉じません。そして、ダイアログを表示する前にしかできません。コールバック内では機能しません。

66
Rene

素晴らしい質問です。私もそれをやろうとしていて、解決策を見つけました。

ダイアログビルダークラスを使用するAlertDialog.Builder次のようなダイアログを起動する必要があります。

AlertDialog.Builder builder = new AlertDialog.Builder();
AlertDialog dialog;

builder.set...

dialog = builder.create();
dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();

これはうまくいきました。

注:import Android.view.WindowManager.LayoutParams;そこの定数値。

167
SparK
 AlertDialog dialog = new AlertDialog.Builder(this).create();
    dialog.show();
    Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
5
Deli Coder