ao usar AlertDialog.Builder com EditText, o teclado virtual não aparece

117

Estou usando AlertDialog.Builder para criar uma caixa de entrada, com EditText como método de entrada.

Infelizmente, o teclado virtual não aparece, embora o EditText esteja em foco, a menos que você o toque explicitamente novamente.

Existe uma maneira de forçá-lo a estourar?

Tentei o seguinte, após (AlertDialog.Builder) .show (); mas sem sucesso.

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

Alguém pode ajudar?

Obrigado!!

niros
fonte
1
formate seu código-fonte.
philipp,
Então eu também te votei :) Tive o mesmo problema ao pesquisar por várias horas e a última resposta de grine4ka funciona muito bem
philipp

Respostas:

222

Eu fiz tal coisa

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

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

dialog.show();
grine4ka
fonte
3
Muito obrigado. Já faz um tempo que procuro e esse é o caminho que você quer seguir. Todas as OnFocusChangeListenerabordagens parecem muito para mim e causam problemas. Você tem que criar AlertDialogo AlertDialog.Builder!
philipp,
Este é realmente uma solução? Isso só força o teclado a mostrar, independente se existe um campo de entrada ou não, não importa se o campo de entrada está em foco ou não, certo? =)
Ted
@Ted, você está certo, esta não é a solução real, mas funciona. Tentei fazer isso se não houver texto de edição na caixa de diálogo e o teclado virtual não aparecer.
grine4ka
1
Na verdade, consigo "resolvê-lo" (solução alternativa). Eu uso o setOnFocusChangeListener para o EditText, e em onFocusChange se ele tem foco (a var "hasFocus") e se sim, eu faço getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted
1
Nota: Para que isso funcione, você precisa colocar a setSoftInputModelinha antes dialog.show() ou não vai funcionar. 1 para a solução correta simples btw
Spikatrix
29

Eu consegui resolver assim:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Alex Fragotsis
fonte
23

Descobri que o mesmo código funciona corretamente no Tablet, o teclado aparece, mas no Phone não, então pesquisar mais parece apontar para a opção "ajustar".

Estou usando isso, parece muito mais limpo.

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();
Phuah Yee Keat
fonte
Obrigado. Isso é muito melhor do que usar SOFT_INPUT_STATE_ALWAYS_VISIBLE. Como SOFT_INPUT_STATE_ALWAYS_VISIBLEvai bloquear os componentes da IU da caixa de diálogo, onde é SOFT_INPUT_ADJUST_RESIZEpossível redimensionar e "empurrar" a caixa de diálogo.
Cheok Yan Cheng
10

No meu caso, a única maneira de mostrar o teclado quando a caixa de diálogo foi exibida foi adicionando ao meu DialogFragment:

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

Observe o SOFT_INPUT_STATE_ALWAYS_VISIBLE em vez de SOFT_INPUT_STATE_VISIBLE .

Da documentação:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.
vovahost
fonte
Esta foi a única solução que funcionou para mim e eu tentei LOADS deles. O meu foi um build de dialogfragment do construtor alertdialog. A parte importante parecia ser colocar o código acima no onResume (). Em qualquer outro lugar, simplesmente não funcionou!
user960914
6

Quando você chama showDialog para mostrar um diálogo criado usando AlertDialog em onCreateDialog

Você deve colocar o código aqui

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

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

}
user590912
fonte
5

Uma solução muito melhor é fornecida aqui .

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Sem solução alternativa. EditTextse comporta conforme o esperado.

sulai
fonte
Este funcionou para mim, a outra solução estava trazendo o foco, mas o teclado não foi exibido.
Akshay de
2
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);
Mohammed Shoeb
fonte
1

Isso já foi respondido aqui . Usar um OnFocusChangeListener funcionou para mim.

dhaag23
fonte
A questão pergunta como definir o modo de entrada flexível para um objeto AlertDialog.Builder; no entanto, o encadeamento ao qual você se refere fornece um exemplo usando um objeto AlertDialog. Se eu tentar usar o código sugerido (usando alert.getWindow (). SetSoftInputMode (...) dentro de OnFocusChangeListener) objetos Eclipse que o método getWindow () não está definido para o tipo AlertDialog.Builder. Você pode me ajudar a consertar isso, por favor?
prepbgg
1

No meu caso, o SoftInputMode não estava sendo exibido quando o configurei, antes de mostrar a caixa de diálogo (depois de criá-la). O código a seguir funcionou para mim, onde configurei o SoftInputMode após mostrar a caixa de diálogo.

Kotlin:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

Java:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

Espero que isso ajude qualquer pessoa que estava tendo o mesmo problema que eu.

AurumTechie
fonte
0

Tente isso, está funcionando para mim

Se você deseja exibir o teclado virtual:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

E se você quiser escondê-lo:

  InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
Yogesh Rathi
fonte
0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
TonnyTao
fonte
1
É melhor incluir algum contexto / explicação com o código, pois isso torna a resposta mais útil para o OP e para futuros leitores.
EJoshuaS - Reintegrar Monica
0

Esse problema ocorre quando EditText é adicionado depois que AlertDialog.onCreate é chamado.

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

A classe AlertDialog se encarrega de configurar automaticamente o android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM para você com base em se alguma visualização na caixa de diálogo retorna verdadeiro de View.onCheckIsTextEditor ().

Você precisa limpar o sinalizador FLAG_ALT_FOCUSABLE_IM.

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

Como AlertDialog.show é chamado no DialogFragment.onStart, você pode inserir o código no DialogFragment.onStart.

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Ou você pode usar o Dialog.setOnShowListener se não usar um DialogFragment.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
Parque Sungsuh
fonte