Como desativar o pop-up do teclado quando em editar texto?

85

No meu aplicativo, a primeira visualização de todas as minhas telas é um EditText, portanto, sempre que vou para uma tela, o teclado na tela é exibido. como posso desativar este popingup e ativá-lo quando clicado manualmente no EditText ????

    eT = (EditText) findViewById(R.id.searchAutoCompleteTextView_feed);

    eT.setOnFocusChangeListener(new OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {

            if(hasFocus){
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
            imm.hideSoftInputFromWindow(eT.getWindowToken(), 0);
            }
        }
    });

código xml:

<ImageView
    android:id="@+id/feedPageLogo"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:src="@drawable/wic_logo_small" />

<Button
    android:id="@+id/goButton_feed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:text="@string/go" />

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/goButton_feed"
    android:layout_toRightOf="@id/feedPageLogo"
    android:hint="@string/search" />

<TextView
    android:id="@+id/feedLabel"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/feedPageLogo"
    android:gravity="center_vertical|center_horizontal"
    android:text="@string/feed"
    android:textColor="@color/white" />

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ButtonsLayout_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <Button
        android:id="@+id/feedButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/feed"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/iWantButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/iwant"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/shareButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/share"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/profileButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/profile"
        android:textColor="@color/black" />
</LinearLayout>

<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/feedListView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_above="@id/ButtonsLayout_feed"
    android:layout_below="@id/feedLabel"
    android:textSize="15dp" >
</ListView>

a terceira visualização (EditText) é onde está o foco.

Mosca doméstica
fonte
você pode postar seu código xml.
user1213202

Respostas:

178

A melhor solução está no arquivo Project Manifest (AndroidManifest.xml) , adicione o seguinte atributo na activityconstrução

android: windowSoftInputMode = "stateHidden"


Exemplo:

    <activity android:name=".MainActivity" 
              android:windowSoftInputMode="stateHidden" />

Descrição:

  • O estado do teclado virtual - oculto ou visível - quando a atividade se torna o foco da atenção do usuário.
  • O ajuste feito na janela principal da atividade - se ela é redimensionada para um tamanho menor para abrir espaço para o teclado virtual ou se seu conteúdo se movimenta para tornar o foco atual visível quando parte da janela é coberta pelo teclado virtual.

Introduzido em:

  • API de nível 3.

Link para o Docs

Observação: os valores definidos aqui (diferentes de "stateUnspecified" e "AdjustUnspecified") substituem os valores definidos no tema.

Skynet
fonte
3
Essa abordagem falha se você tiver uma combinação de campos de texto na atividade, alguns para os quais deseja ter um teclado, outros para os quais não. Veja minha resposta para saber como isso pode ser alcançado em uma base por campo de texto em tal cenário.
slogan621 de
@ slogan621por favor, reserve um momento para entender a questão aqui. Você está em uma tangente diferente!
Skynet de
83

Você deve criar uma visualização, acima do EditText, que tenha um foco 'falso':

Algo como :

<!-- Stop auto focussing the EditText -->
<LinearLayout
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@android:color/transparent"
    android:focusable="true"
    android:focusableInTouchMode="true">
</LinearLayout>

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:inputType="text" />

Nesse caso, usei um LinearLayout para solicitar o foco. Espero que isto ajude.

Funcionou perfeitamente ... graças ao Zaggo0

Mosca doméstica
fonte
26
Adicionar uma visualização inútil é uma solução abaixo do ideal em comparação com adicionar android: windowSoftInputMode = "stateHidden" à entrada do manifesto da Activity.
Chris Horner
@ChrisHorner em ambos você precisa especificar para atividade ou layout ... é a mesma coisa chata .. ambos funcionam bem para esta solução.
Nicolas Jafelle
2
Tentei todas as soluções e esta é a única a funcionar bem! obrigado claro e simples
alfo888_ibg
Adicionar uma visualização inútil não é uma boa ideia, como @ChrisHorner disse, é melhor adicionar um atributo no arquivo Manifest conforme sugerido por ele ou adicionar esta linha de código em sua atividade InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
AB9
1
Uma implementação tão ruim da hierarquia de visualizações! Acho que isso deve ser evitado, se possível.
sud007
43
     edittext.setShowSoftInputOnFocus(false);

Agora você pode usar qualquer teclado personalizado de sua preferência.

Matthew556
fonte
Obrigado, esta é a única solução aqui que funciona para mim + é curta e fácil.
Max O.
20
está disponível na API de nível 21
Jithu PS
Isso é o que eu estava procurando.
Sanjay Joshi
@ JithuP.S, por que está trabalhando em titânio Karbon cujo nível de API é 19 ??
尤金寶 漢子
23

As pessoas sugeriram muitas soluções excelentes aqui, mas usei essa técnica simples com meu EditText (nada em java e AnroidManifest.xml é necessário). Basta definir o focusable e focusableInTouchMode como false diretamente no EditText.

 <EditText
        android:id="@+id/text_pin"
        android:layout_width="136dp"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:textAlignment="center"
        android:inputType="numberPassword"
        android:password="true"
        android:textSize="24dp"
        android:focusable="false"
        android:focusableInTouchMode="false"/>

Minha intenção aqui é usar esta caixa de edição na atividade de bloqueio do aplicativo, onde estou pedindo ao usuário para inserir o PIN e quero mostrar meu PIN pad personalizado. Testado com minSdk = 8 e maxSdk = 23 no Android Studio 2.1

insira a descrição da imagem aqui

AB
fonte
isso facilitou minha vida stackoverflow.com/questions/9577304/…
Mohammed mansoor
20

Adicione o código abaixo em sua classe de atividade.

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

O teclado aparecerá quando o usuário clicar em EditText

Sonia John Kavery
fonte
10

Você pode usar o código a seguir para desativar o teclado na tela.

InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Lúcifer
fonte
1
e posso habilitá-lo novamente usando EditText.onClick (im.unhideSoftInputFromWindow (editText.getWindowToken (), 0);) ou algo parecido ??
Housefly
8

Duas soluções simples:

A primeira solução é adicionada abaixo da linha de código no arquivo xml de manifesto. No arquivo Manifest (AndroidManifest.xml), adicione o seguinte atributo na construção da atividade

android: windowSoftInputMode = "stateHidden"

Exemplo:

<activity android:name=".MainActivity" 
          android:windowSoftInputMode="stateHidden" />

A segunda solução é adicionar a linha de código abaixo na atividade

//Block auto opening keyboard  
  this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Podemos usar qualquer uma das soluções acima. obrigado

kgsharathkumar
fonte
5

Declare a variável global para InputMethodManager:

 private InputMethodManager im ;

Em onCreate (), defina-o:

 im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
 im.hideSoftInputFromWindow(youredittext.getWindowToken(), 0);

Defina o onClickListener para esse texto de edição dentro de oncreate ():

 youredittext.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        im.showSoftInput(youredittext, InputMethodManager.SHOW_IMPLICIT);
    }
});

Isso vai funcionar.

AndroGeek
fonte
Por favor, poste seu código. O que você está recebendo enquanto executa.
AndroGeek
todo o código está em questão, o teclado na tela não aparece quando clico no texto de edição
Housefly
Você está testando isso usando um emulador ou dispositivo. Se você estiver tentando usar um emulador, não obterá as teclas programáveis. Teste-o usando um dispositivo. Vai funcionar.
AndroGeek
sim, estou usando um dispositivo para testar
Housefly
Hmmm isso é estranho. Se você pudesse postar seu código, o método no qual você escreveu, isso poderia ser de alguma ajuda. Ou então o código acima está funcionando perfeitamente bem no meu dispositivo.
AndroGeek
4

Use o seguinte código, escreva-o em onCreate()

InputMethodManager inputManager = (InputMethodManager)
                                   getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                   InputMethodManager.HIDE_NOT_ALWAYS);         
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Dharmaraj Patil
fonte
4

experimente ... eu resolvo esse problema usando o código: -

EditText inputArea;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
inputArea = (EditText) findViewById(R.id.inputArea);

//This line is you answer.Its unable your click ability in this Edit Text
//just write
inputArea.setInputType(0);
}

nada que você possa inserir pela calculadora padrão em nada, mas você pode definir qualquer string.

tente

Rabino SMFazle
fonte
3

Obrigado @AB pela boa solução

    android:focusableInTouchMode="false"

neste caso, se você desabilitar o teclado na edição de texto, basta adicionar android: focusableInTouchMode = "false" na tagline de edição de texto .

funcionam para mim no Android Studio 3.0.1 minsdk 16, maxsdk26

NZXT
fonte
1
Este é um comentário para A.Ba resposta? Ou é uma resposta à pergunta original? Se este for um comentário para A.Ba resposta, você deve usar a opção de comentário fornecida por StackOverflow e excluir esta resposta da pergunta original.
David Walschots,
desculpe se não entendi responder a resposta resolvida. Agradeço a AB por uma boa resposta para esclarecer meu problema .. se eu estiver errado, posso excluir essa resposta, desculpe @DavidWalschots.
NZXT
2

Experimente com isto:

EditText yourEditText= (EditText) findViewById(R.id.yourEditText); 
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT); 

Para fechar, você pode usar:

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

Experimente assim em seu código:

ed = (EditText)findViewById(R.id.editText1);

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

ed.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
        imm.showSoftInput(ed, InputMethodManager.SHOW_IMPLICIT);  
    }
});
user1213202
fonte
ele está funcionando da mesma maneira que antes ... são algumas alterações que eu preciso fazer no layout ?? para esta visão EditText ??
Housefly
ok, agora funciona após adicionar alguns atributos de layout ... android: clickable = "true" android: cursorVisible = "false" android: focusable = "false" obrigado
Housefly
não.fazer uma coisa.escrever a ocultação do código do teclado no método edittext.setOnFocusChangeListener () e tentar
user1213202
esta seria a solução SE você pudesse especificar exatamente quando usar a chamada de hideSoftInput. o teclado aparece automaticamente APÓS onCreate e onResume
ahmet emrah
2

A única coisa que você precisa fazer é adicionar android:focusableInTouchMode="false"ao EditText em xml e pronto. (Se alguém ainda precisar saber como fazer isso da maneira mais fácil)

GoldFish
fonte
2

Bem, eu tive o mesmo problema e apenas resolvi com focalizável no arquivo XML.

<EditText
            android:cursorVisible="false"
            android:id="@+id/edit"
            android:focusable="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

Você provavelmente também está procurando por segurança. Isso também ajudará nisso.

Divyansh
fonte
1

Use o seguinte código em seu onCreate()método-

    editText = (EditText) findViewById(R.id.editText);
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        public void run() {
            InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.hideSoftInputFromWindow(
                    editText.getWindowToken(), 0);
        }
    }, 200);
Priyanka
fonte
1

Para usuários Xamarin:

[Activity(MainLauncher = true, 
        ScreenOrientation = ScreenOrientation.Portrait, 
        WindowSoftInputMode = SoftInput.StateHidden)] //SoftInput.StateHidden - disables keyboard autopop
Roy Doron
fonte
1
       <TextView android:layout_width="match_parent"
                 android:layout_height="wrap_content"

                 android:focusable="true"
                 android:focusableInTouchMode="true">

                <requestFocus/>
      </TextView>

      <EditText android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
NickUnuchek
fonte
1

Se você estiver usando o Xamarin, você pode adicionar este

Activity[(WindowSoftInputMode = SoftInput.StateAlwaysHidden)]

depois disso, você pode adicionar esta linha no método OnCreate ()

youredittext.ShowSoftInputOnFocus = false;

Se o dispositivo de destino não suportar o código acima, você pode usar o código abaixo no evento de clique EditText

InputMethodManager Imm = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
Imm.HideSoftInputFromWindow(youredittext.WindowToken, HideSoftInputFlags.None);
Ashish Sinha
fonte
1

Descobri que o seguinte padrão funciona bem para mim no código em que desejo mostrar uma caixa de diálogo para obter a entrada (por exemplo, a string exibida no campo de texto é o resultado de seleções feitas a partir de uma lista de caixas de seleção em uma caixa de diálogo, em vez de texto digitado através do teclado).

  1. Desative o foco de entrada suave no campo de edição. Não posso desabilitar para toda a atividade, pois há campos de edição para os quais quero que o teclado seja usado no mesmo layout.
  2. Os cliques iniciais no campo de texto produzem uma mudança de foco, um clique repetido produz um evento de clique. Então, eu substituo ambos (aqui, não refatorei o código para ilustrar que os dois manipuladores fazem a mesma coisa):

    tx = (TextView) m_activity.findViewById(R.id.allergymeds);
    if (tx != null) {
        tx.setShowSoftInputOnFocus(false);
        tx.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if (hasFocus) {
                    MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                    mld.setPatientId(m_sess.getActivePatientId());
                    mld.show(getFragmentManager(), "Allergy Medications Dialog");
                }
            }
        });
        tx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                mld.setPatientId(m_sess.getActivePatientId());
                mld.show(getFragmentManager(), "Allergy Medications Dialog");
            }
        });
    }
    
slogan 621
fonte
0

Em um aplicativo Android que eu estava construindo, tinha três EditTexts LinearLayoutdispostos horizontalmente. Tive que evitar que o teclado virtual aparecesse quando o fragmento carregasse. Além de definir focusablee focusableInTouchModeverdadeiro no LinearLayout, tive que definir descendantFocusabilitypara blocksDescendants. Em onCreate, eu chamei requestFocusoLinearLayout . Isso evitou que o teclado apareça quando o fragmento é criado.

Layout -

    <LinearLayout
       android:id="@+id/text_selector_container"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:weightSum="3"
       android:orientation="horizontal"
       android:focusable="true"
       android:focusableInTouchMode="true"
       android:descendantFocusability="blocksDescendants"
       android:background="@color/black">

       <!-- EditText widgets -->

    </LinearLayout>

Em onCreate-mTextSelectorContainer.requestFocus();

indyfromoz
fonte
0

Se alguém ainda está procurando a solução mais fácil, defina o seguinte atributo como trueem seu layout pai

android:focusableInTouchMode="true"

Exemplo:

<android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="true">

.......
......
</android.support.constraint.ConstraintLayout>
Ajmal Salim
fonte
eleitores abaixo, por favor, comente seus argumentos antes de votar contra!
Ajmal Salim
0

Use isto para ativar e desativar EditText ....

InputMethodManager imm;

imm = (InputMethodManager)
getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);

if (isETEnable == true) {

    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    ivWalllet.setImageResource(R.drawable.checkbox_yes);
    etWalletAmount.setEnabled(true);
    etWalletAmount.requestFocus();
    isETEnable = false;
    } 
else {

    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
    ivWalllet.setImageResource(R.drawable.checkbox_unchecked);
    etWalletAmount.setEnabled(false);
    isETEnable = true;
    }
Android Chandigarh Reaston
fonte
0

Tente esta resposta,

editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);

Nota: apenas para API 11+

Ranjith Kumar
fonte
0
private InputMethodManager imm;

...


editText.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        hideDefaultKeyboard(v);
        return true;
    }
});

private void hideDefaultKeyboard(View et) {
  getMethodManager().hideSoftInputFromWindow(et.getWindowToken(), 0);
}

private InputMethodManager getMethodManager() {
        if (this.imm == null) {
            this.imm = (InputMethodManager)  getContext().getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
        }
  return this.imm;
}
Denis Raison
fonte
-1

para qualquer visualização de texto em sua atividade (ou crie uma visualização de texto vazia falsa com android: layout_width = "0dp" android: layout_height = "0dp") e adicione para esta visualização de texto a seguir: android: textIsSelectable = "true"

Alex Artemenko
fonte
-1

Simples, basta remover a tag "" do arquivo xml

Jeyanth
fonte
2
Por favor, você pode elaborar sobre isso e mostrar um exemplo. Por favor, veja como responder .
Bugs
-1

Só precisa adicionar uma propriedade android:focusable="false"em particular EditTextno xml do layout. Em seguida, você pode escrever listner de cliques EditTextsem pop-up do teclado.

Sree
fonte
-1

O problema pode ser classificado usando, Não há necessidade de definir editText inputType para quaisquer valores, apenas adicione a linha abaixo, editText.setTextIsSelectable (true);

uma corrida
fonte
Ei, obrigado por escrever uma resposta! No entanto, como já existem tantas respostas aqui, pode ser ainda mais útil se você realmente escrever isso como um comentário sobre a resposta de Ranjith Kumar, em vez de torná-la sua própria resposta. Também pode ser interessante mencionar qual seria o efeito de deixar de fora o inputType. Mas parece que seria bom saber se eu tivesse seguido a outra resposta, então, mesmo que você insista em mantê-la como sua própria resposta, considere deixar um comentário lá mesmo assim.
Marque