Abra o teclado virtual programaticamente

115

Eu tenho uma atividade sem widgets filho para ela e o arquivo xml correspondente é,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
>
</LinearLayout>

e eu quero abrir o teclado virtual programaticamente enquanto a atividade começa. e o que tentei até agora é,

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

Dê-me alguma orientação.

Vignesh
fonte
oi vignesh mas qual é a necessidade de abrir o teclado virtual sem qualquer textView?
milind
Na verdade, estou tentando usar o ouvinte-chave nessa atividade, para isso preciso fazer isso.
Vignesh,
O que você fez está correto. Não sei por que você não está vendo o teclado. Usei esse código uma vez para iniciar o teclado sem nenhuma ação do usuário em um editText e foi bem-sucedido.
Vinoth,
Olá, Vinoth. Mudei meu código exatamente como as postagens do DSouza e atualizei minha pergunta também, então verifique se há algo que devo alterar.
Vignesh,

Respostas:

145

Usei as seguintes linhas para exibir o teclado virtual manualmente dentro do evento onclick, e o teclado está visível.

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

Mas ainda não consigo abrir enquanto a atividade é aberta. Existe alguma solução para isso?

Vignesh
fonte
@YosiTaguri, muito mais elegante se você estiver lidando com atividades. E quanto aos fragmentos ?! +1 para ambas as respostas
S.Thiongane
e se você tiver que abrir o teclado na caixa de diálogo com a edição de texto? Como fazer isso?
seema
5
@Vignesh: você precisa dar algum atraso, como 500 milissegundos, ao abrir o teclado se quiser implementar este código no momento de iniciar a atividade.
Vinit Saxena
@vinitsaxena Obrigado por seu valioso comentário
Vignesh
não tenho certeza, mas tentei obter qualquer visualização, por exemplo, TextView e anexar ouvinte como este myTextView.post (new Runnable () {public void run () {// aqui seu método}}); e quando esta visualização for criada, significa que todas as telas visíveis agora você pode chamar como quiser
Aleksey Timoshchenko
121

Em seu arquivo de manifesto, tente adicionar o seguinte ao <activity>que deseja mostrar no teclado quando a atividade começar:

android:windowSoftInputMode="stateVisible"

Isso deve fazer com que o teclado fique visível quando a atividade começar.

Para mais opções, verifique a documentação .

Jemerick
fonte
3
Gostaria de poder votar positivamente com mais frequência para esta resposta apenas para colocar todos aqueles hacks sujos no final da página;)
fjdumont
Como você faz isso programaticamente? Eu só quero que o teclado apareça automaticamente em certas situações.
phreakhead
1
eu tenho uma caixa de diálogo de entrada como este link de link como mostrar o teclado não em atividade, mas no prompt? isso funcionou, obrigado <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef
7
Ele diz "programaticamente".
Mert Akcakaya
2
Não funciona para mim. Em vez disso, ele faz: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya
33

Por favor, siga o código abaixo. Tenho certeza que seu problema será resolvido.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 
AndroidDanger
fonte
Olá. Acabei de colar seu código dentro da função onCreate, mas ainda não houve alteração na minha atividade, se você quiser que eu cole o código, colarei o comentário.
Vignesh de
Quando desejar acessar o softkeyboard avise-me para que eu resolva seu problema. Envie-me o código ... se possível
AndroidDanger
Desejo definir onKeyboardActionListener para minha atividade, que não tem nada além de layout linear.
Vignesh,
Basta ver minha pergunta acima na qual editei o código com o que você me forneceu.
Vignesh,
Esta atividade é apenas para ação do teclado, eu quero ouvir cada tecla pressionada (usando onKeyboardActionListener) e vou passá-la para o servidor local simultaneamente
Vignesh
25

Isso funciona

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

ou

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
ahtartam
fonte
2
Obrigado pela forma programática de definir isso - isso funciona, enquanto os hacks InputMethodManager não.
Martin Vysny
17

Tudo que eu precisava era expor o teclado, em um momento muito preciso. Isso funcionou para mim! Obrigado Benites.

    private Handler mHandler= new Handler();

E no momento exato:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 
DiegoSoto
fonte
Esta solução funcionou para mim dentro de onResume () com uma pequena modificação em atrasar a ação post: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper
1
Eu recomendaria colocá-lo em um retorno de chamada ViewTreeObserver para que ele seja chamado no primeiro layout para evitar ter que esperar por um período arbitrário de tempo. Deve ser mais seguro / responsivo.
Gabriel,
Apenas esta solução funcionou para mim. Eu tinha métodos anteriores que funcionavam, mas infelizmente para o sistema operacional mais recente, o manipulador é a solução viável.
MD. Shafiul Alam Biplob
12

Usei as seguintes linhas para exibir o teclado virtual manualmente dentro do evento onclick.

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }
RAM
fonte
9

Coloque isso no método onResume:

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

o executável é necessário porque quando o sistema operacional dispara o método onResume, você não pode ter certeza de que todas as visualizações foram desenhadas, portanto, o método post chamado de seu layout raiz o faz esperar até que todas as visualizações estejam prontas.

Marcelo Benites
fonte
1
Eu tinha um SearchView em um DialogFragment e a primeira vez que o Dialog apareceu, o SearchView tinha foco ... mas o teclado NÃO estava ativo a menos que o usuário o tocasse. Tentamos usar apenas showSoftInput e também alternarSoftInputFromWindow do OnResume SOZINHO ... ou até mesmo no OnFocusChangeListener para o SearchView ... mas nenhum deles funcionou porque pareciam disparar antes de a janela ser aberta e desenhada ... .usar este pós-evento no OnResume finalmente resolveu.
lepert de
8

parece que isso está funcionando

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

parece que funciona melhor: no manifesto:

<application>
    <activity
        android:name="com.doodkin.myapp.ReportActivity"
        android:label="@string/title_activity_report"
        android:screenOrientation="sensor" 
        android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

parece que o manifesto está funcionando no Android 4.2.2, mas não no Android 4.0.3

Shimon Doodkin
fonte
8

no método de atividade onCreate ou onActivityCreated de um fragmento

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });
Alex
fonte
6

Usei assim para mostrar o teclado virtual de maneira programática e isso funcionou para mim para evitar o redimensionamento automático da tela ao iniciar o teclado.

No manifesto:

<activity android:name="XXXActivity" android:windowSoftInputMode="adjustPan">
</activity>

Em XXXActvity:

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

Presumo que isso poupará tempo de outras pessoas para pesquisar esse problema.

Noundla Sandeep
fonte
Funciona, mas o teclado permanece visível mesmo se você sair do aplicativo, e assim que você fechar o teclado se abrir o aplicativo novamente, o teclado não aparecerá
nulll
Eu não enfrentei esse problema até agora. Presumo que seja um problema do dispositivo.
Noundla Sandeep
Por que o cronômetro é necessário? Você pode adicionar links para ir mais fundo?
nulll
6

Kotlin

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

Java

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
Khemraj
fonte
3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
Kai Wang
fonte
3

Eu usei como singleton como:

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Use-o em suas atividades como:

showSoftKeyboard(this, yourEditTextToFocus);
Shylendra Madda
fonte
Muito obrigado por incluir um pequeno snippet sobre como usar a função, bem como a própria função. Funciona exatamente como eu precisava!
Chad Wilson
3

Isso funciona:

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

E você chama esse método assim:

showKeyboard(NameOfActivity.this);
Thiago Silva
fonte
2

InputMethodManager.SHOW_FORCED não é uma boa escolha. Se você usar esta configuração, deverá gerenciar ocultar o estado do teclado. Minha sugestão é a seguinte;

    public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}

Além disso, você pode focar na visualização (geralmente EditText) tomando seus parâmetros. Isso o torna uma função mais útil

para obter mais informações sobre InputMethodManager.SHOW_IMPLICIT e SHOW_FORCED; InputMethodManager

Cafer Mert Ceyhan
fonte
1

Este é o código-fonte necessário:

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

Para obter detalhes, acesse este link. Isso me ajudou. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md

Nikhil Losalka
fonte
1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Use o código acima em onResume () para abrir o teclado virtual

Sanket Parchande
fonte
1

Semelhante à resposta de @ShimonDoodkin, foi o que fiz em um fragmento.

https://stackoverflow.com/a/29229865/2413303

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

Onde ShowKeyboardestá

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

Depois de uma entrada bem-sucedida, também oculto o teclado

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);
EpicPandaForce
fonte
1
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

public static void hideKeyboard(final Activity activity) {
    final View view = activity.getCurrentFocus();
    if (view != null) {
        final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}
Arsen
fonte
0

Já existem muitas respostas, mas nada funcionou para mim além disso

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

Eu usei showSoftInputcomSHOW_FORCED

E minha atividade tem

 android:windowSoftInputMode="stateVisible|adjustResize"

espero que isso ajude alguém

spaceMonkey
fonte
0

Poste este método em sua atividade base e use-o em outras atividades como um feitiço

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
Ajay Chauhan
fonte