Отображение мягкой клавиатуры при открытии объекта AlertDialog.builder

StackOverflow https://stackoverflow.com/questions/4054662

Вопрос

Мой код для открытия диалогового окна ввода читается следующим образом:

final AlertDialog.Builder alert = new AlertDialog.Builder(this);  
alert.setTitle("Dialog Title");  
alert.setMessage("Request information");  
LayoutInflater factory = LayoutInflater.from(this);
final View textEntryView = factory.inflate(R.layout.edittextautotextlayout, null);
final EditText inputBox = (EditText) textEntryView.findViewById(R.id.my_et_layout);
alert.setView(inputBox);

Это работает нормально, за исключением того, что я должен использовать линию ввода текста до появления мягкой клавиатуры.

После предоставленного совета здесь Я попробовал вставить:

inputBox.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            alert.getWindow().setSoftInputMode( 
               WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

Но Eclipse объекты, которые «метод getWindow () не определен для типа alertdialog.builder".

Похоже, что код SetOnfocuschangeListener работает для объекта AlertDialog, но не AlertDialog.Builder. Как я должен изменить свой код, чтобы сделать программную клавиатуру автоматически отображаться.

Это было полезно?

Решение 3

С поощрением мур-голосования (см. Его ответ выше) Я ответил на мой вопрос, создавая пользовательский диалог на основе диалогового класса. В отличие от оповещения на основе AlertDialog.Builder, такой пользовательский диалог принимает команду getWindow (). Setsoftinputmode (...) и, следовательно, позволяет отображать программную клавиатуру автоматически.

Для руководства по созданию пользовательского диалога я нашел Эта веб-страница и это Особенно полезно.

Другие советы

До тех пор, пока вам всегда нужно отображать клавиатуру сразу после того, как диалоговое окно не открывается, а не после того, как определенная виджет формы внутри сосредоточен (например, если ваш диалог просто показывает EditText и кнопка), вы можете сделать следующее:

AlertDialog alertToShow = alert.create();
alertToShow.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
alertToShow.show();

А не звонить .show() На вашем Строителе вы можете вместо этого позвонить .create() Что позволяет делать дополнительную обработку на нем, прежде чем отображать его на экран.

Это в ответ на Мианнел.

Следующий метод называется, когда выбрана параметр меню:

private void addNote() {
    final Dialog dialog = new Dialog(this);
    dialog.setContentView(R.layout.textentryalertdialog);
    dialog.setTitle("Add note");
    TextView msgText = (TextView) dialog.findViewById(R.id.messagetext);
    msgText.setText("Whatever prompt you want");
    final EditText inputLine = (EditText) dialog.findViewById(R.id.my_edittext);
    Button okButton = (Button) dialog.findViewById(R.id.OKButton);
    okButton.setOnClickListener(new OnClickListener() {
        public void onClick(View arg0) {
            dialog.dismiss();
            // app specific code
        }           
    });
    Button cancelButton = (Button) dialog.findViewById(R.id.CancelButton);
    cancelButton.setOnClickListener(new OnClickListener() {
        public void onClick(View arg0) {
            dialog.dismiss();
        }           
    });
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    dialog.show();
}

Файл TextentryalertDialog.xml определяет линейную макет, содержащую

TextView Android: ID = "@ + ID / MessageText" ...

Edittext Android: id = "@ + ID / My_edittext" ...

Кнопка Android: id = "@ + Id / okbutton" ...

Кнопка Android: id = "@ + ID / Отмена« ...

Надеюсь, это поможет.

Если вы хотите всплыть диалоговое окно вместе с мягкой накладкой клавиш, чтобы пользователь мог освободить от крана на диалоговом окне «Редактировать текст» внутри, чтобы показать клавиатуру, например, если вы собираетесь предпринять некоторое значение из диалогового окна, затем используйте этот простой код, Это решит вашу проблему.

        public void onClick(final View v) 
        {   
             AlertDialog.Builder alert = new AlertDialog.Builder(v.getContext());                 
              alert.setIcon(R.drawable.smsicon);
              alert.setTitle(" Secrete Code");  
              alert.setMessage("Enter a Key for secrete text !");
              final EditText shft_val = new EditText(v.getContext()); 
              shft_val.setInputType(InputType.TYPE_CLASS_NUMBER);//changing the keyBoard to No only,restrict the string etc
              alert.setView(shft_val);

     //pOp Up the key pad on Edit Text  focus event

             shft_val.setOnFocusChangeListener(new OnFocusChangeListener()
             {
                public void onFocusChange(View arg0, boolean arg1)
                {  InputMethodManager inputMgr = (InputMethodManager)v.getContext().
                                    getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);
                        }
                    });

                 alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() 
                 {  
                 public void onClick(DialogInterface dialog, int whichButton) 
                 {
                    //Your specific code... 
                 }
                 });
                 alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                     public void onClick(DialogInterface dialog, int which) {                       
                         dialog.dismiss();
                         return;   
                     }
                 });
                       alert.show();
                    }

попробуйте использовать inputBox

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

Попробуйте использовать просмотр

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

Вы пытались установить фокус на свой eDittext -> inputbox.requestfocus () или что-то в этом роде?

Я знаю, этот вопрос действительно старый, но так как я пробовал около 20 различных так называемых «решений», я опубликую, что на самом деле только для меня работал.

Этот ответ основан на ответе Пира Фахима Шаха, который указал на меня в правильном направлении (спасибо):

Убедитесь, что вы поместите это в OnCreate вашей активности, чтобы принудительные клавиатуры скрыты, когда диалог закрыт:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Затем создайте такой диалог:

    AlertDialog.Builder builder = new Builder(this);
    builder.setTitle("title");
    final EditText input = new EditText(this);
    input.setText("text");
    input.setSelection(input.getText().length()); // set cursor to end
    builder.setView(input);
    input.setOnFocusChangeListener(new OnFocusChangeListener()  {
       public void onFocusChange(View v, boolean hasFocus) { 
           if(hasFocus) {
               InputMethodManager inputMgr = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
               inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);
           }
       }
    });
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            // do something here
            dialog.dismiss();
        }
    });
    builder.setNegativeButton("Cancel", null);
    builder.show();

Я думаю, что у вас почти не было работы в вашем первоначальном вопросе. Попробуйте создать а final AlertDialog звонить getWindow() на, например,

// Create the dialog used to modify the mailbox alias
final AlertDialog dialog = alert.create();

inputBox.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode( 
               WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

Я проверил этот код, и клавиатура теперь появляется автоматически в большинстве моих устройств, в том числе:

  • Samsung Galaxy Tab OS 2.2
  • Samsung Galaxy S OS 2.1
  • HTC Sensation OS 2.3.4

Некоторые другие комментарии к этому решению:

1) Проверьте, есть ли у вас что-нибудь в своем XML, уже запросить фокус, так как это может остановить этот код, работающий (в соответствии с TED в этом вопросе, на который вы ссылаетесь).

2) Этот код не работает на моем HTC G2 работает OS 2.3.4. Я думаю, это потому, что у него есть физическая клавиатура, а может быть WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE Вариант не работает с этим?

Я также попробовал Soft_input_state_Visible (без всегда), но это остановило клавиатуру, появляющуюся автоматически.

3) Вы также можете добавить код, чтобы пользователь мог нажать кнопку «Готово» на клавиатуре, чтобы отправить изменения, например

inputAlias.setOnKeyListener(new OnKeyListener()
{
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event)
  {
    if (keyCode == KeyEvent.KEYCODE_ENTER &&
        inputAlias.isFocused() &&
        inputAlias.getText().length() != 0)
    {
      // Save the new information here

  // Dismiss the dialog
      dialog.dismiss();
      return true;
    }
    return false;
  }
});

Я создаю Ань AlertDialog и используйте пользовательский вид, который содержит EditText. Отказ И я хочу, чтобы мягкая клавиатура была показана, когда отображается диалоговое окно, и скрыто, является ли пользователь кнопки OK или где-то за пределами диалогового окна.

Этот кусок кода от androidx.perference.PreferenceDialogFragmentCompat И я немного очищаю.

final AlertDialog.Builder builder = new AlertDialog.Builder(context)
        .setTitle(mDialogTitle)
        .setPositiveButton(mPositiveButtonText, null)
        .setNegativeButton(mNegativeButtonText, null);

View contentView = LayoutInflater.from(context).inflate(resId, null);

mEditText = contentView.findViewById(android.R.id.edit);

/**
 * From PreferenceDialogFragmentCompat.needInputMethod
 * <p>Note: If your application targets P or above, ensure your subclass manually requests
 * focus (ideally in {@link #onBindDialogView(View)}) for the input field in order to
 * correctly attach the input method to the field.
 */
mEditText.requestFocus();

builder.setView(contentView);

final Dialog dialog = builder.create();
dialog.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

// This is not from PreferenceDialogFragmentCompat and I add it.
// It seems the soft keyboard won't get dismissed on some old devices without this line.
dialog.setOnDismissListener {
    dialog.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}

dialog.show();

Вам не нужно модифицировать манифест. Он автоматически фокусируется на EditText И будет уволен, щелкните ли вы кнопки действия диалогового окна или где-то за пределами диалогового окна.

Привет, PrepBGG на самом деле есть альтернативный способ к тому, что вы сделали. На самом деле я должен был использовать мой в моем ArrayAdapter. То, что я сделал, было передано контекст деятельности в ArrayAdapter, а затем назовите его для доступа к GetWindow () что-то вроде этого:

NoteArrayAdapter(Activity _activity, int _layout, ArrayList<Note> _notes, Context _context) {
  callingNoteListObj = (NoteList) _context;
}

// withiin getView

callingNoteListObj.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

// within parent activity's onCreate()
thisObject = this;

//within my parent activity's fillData() (NoteList)
adapter =  new NoteArrayAdapter(activity, R.layout.channel_note_list_item, noteList, thisObject);

В следующем фрагменте кода я покажу, как провести произвольно LinearLayout в DialogFragment. Отказ Один, использующий AlertDialog (где мягкая клавиатура не работает) и другой способ без использования AlertDialog (Где мягкая клавиатура работает!):

public static LinearLayout createLinearLayout(Context context)
{
    LinearLayout linearLayout = new LinearLayout(context);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    linearLayout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    String html;
    html = "<form action=search method=get >\n";
    html += "Google Search: <input name=q value=\"Johnny Depp\" /><br/>\n";
    html += "<input type=submit name=output value=search /><br/>\n";
    html += "</form>\n";
    WebView webView = new WebView(context);
    webView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebChromeClient(new WebChromeClient());
    webView.setWebViewClient(new WebViewClient());
    webView.loadDataWithBaseURL("http://www.google.com", html, "text/html", "UTF-8", null);
    linearLayout.addView(webView);
    return linearLayout;
}

public void showWithAlertDialog()
{
    DialogFragment dialogFragment = new DialogFragment()
    {
        public Dialog onCreateDialog(Bundle savedInstanceState)
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder
                .setTitle("With AlertDialog")
                .setView(createLinearLayout(getActivity()));
            return builder.create();
        }
    };
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    dialogFragment.show(fragmentTransaction, "dialog");
}

public void showWithoutAlertDialog()
{
    DialogFragment dialogFragment = new DialogFragment()
    {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            getDialog().setTitle("Without AlertDialog");
            getDialog().setCanceledOnTouchOutside(false);
            return createLinearLayout(getActivity());
        }
    };
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    dialogFragment.show(fragmentTransaction, "dialog");
}

Я нашел это работало в диалоге оповещения, называемыми из разных мест

        case R.id.birthyear:
        case R.id.ymax:
            input.setInputType(InputType.TYPE_CLASS_NUMBER);
            break;

Разум, я тоже пытался много других вещей. Кажется деликатным.

.SetView () автоматически приведет к клавиатуре в диалоговом окне. Обратите внимание на «окончательный» на самом элементе. ВАЖНЫЙ!

AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Random Title...");
alert.setMessage("Type a name");

final EditText input = new EditText(this);

//Set input focus (which opens the android  soft keyboard)
alert.setView(input);   
input.setHint("My Name is...");
//Set keyboard type
input.setInputType(InputType.TYPE_CLASS_TEXT); 

//add button onclick handlers...

alert.show();

Я думаю, что многие люди действительно переусердствуют со всеми функциями ... Это довольно универсально и отлично работает. И это не будет раздувать ваш код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top