Come disabilitare il popup della tastiera su edittext?


85

Nella mia app la prima visualizzazione di tutti i miei schermi è un EditText, quindi ogni volta che vado su una schermata viene visualizzata la tastiera su schermo. come posso disabilitare questo popup e abilitarlo quando si fa clic manualmente su 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);
            }
        }
    });

codice 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>

la terza vista (EditText) è dove si trova il focus.


puoi pubblicare il tuo codice xml. completamente.
user1213202

Risposte:


178

La soluzione migliore sta nel file Manifest del progetto (AndroidManifest.xml) , aggiungi il seguente attributo nel activitycostrutto

android: windowSoftInputMode = "stateHidden"


Esempio:

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

Descrizione:

  • Lo stato della tastiera virtuale, che sia nascosta o visibile, quando l'attività diventa il centro dell'attenzione dell'utente.
  • La regolazione apportata alla finestra principale dell'attività: se viene ridimensionata più piccola per fare spazio alla tastiera virtuale o se il suo contenuto si sposta per rendere visibile il focus corrente quando parte della finestra è coperta dalla tastiera virtuale.

Introdotto in:

  • Livello API 3.

Link ai documenti

Nota: i valori impostati qui (diversi da "stateUnspecified" e "AdjustUnspecified") sovrascrivono i valori impostati nel tema.


3
Questo approccio fallisce se nell'attività è presente una combinazione di campi di testo, alcuni per i quali si desidera avere una tastiera, altri per i quali no. Vedi la mia risposta per come questo può essere ottenuto su base per campo di testo in un tale scenario.
slogan621

@ slogan621 per favore dedica un momento alla comprensione della domanda qui. Sei su una tangente diversa!
Skynet

83

Devi creare una vista, sopra l'EditText, che abbia un focus 'falso':

Qualcosa di simile a :

<!-- 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" />

In questo caso, ho usato un LinearLayout per richiedere lo stato attivo. Spero che sia di aiuto.

Ha funzionato perfettamente ... grazie a Zaggo0


26
L'aggiunta di una visualizzazione inutile è una soluzione subottimale rispetto all'aggiunta di android: windowSoftInputMode = "stateHidden" alla voce manifest dell'attività.
Chris Horner

@ChrisHorner in entrambi è necessario specificare per attività o layout ... è la stessa cosa fastidiosa .. entrambi funzionano bene per questa soluzione.
Nicolas Jafelle

2
Ho provato tutte le soluzioni e questa è l'unica che funziona correttamente! grazie chiaro e semplice
alfo888_ibg

Aggiungere una vista inutile non è una buona idea come ha detto @ChrisHorner, meglio aggiungere un attributo nel file Manifest come suggerito da lui o aggiungere questa riga di codice nella tua attività InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
aB9

1
Una cattiva implementazione della gerarchia di visualizzazione! Penso che questo dovrebbe essere evitato se possibile.
sud007

43
     edittext.setShowSoftInputOnFocus(false);

Ora puoi utilizzare qualsiasi tastiera personalizzata che ti piace.


Grazie, questa è l'unica soluzione qui che funziona per me + è breve e facile.
Max O.

20
è disponibile dal livello API 21
Jithu PS

Questo è quello che stavo cercando.
Sanjay Joshi

@ JithuP.S, perché sta lavorando su Karbon titanium il cui livello API è 19 ??
尤金寶 漢子

23

Le persone hanno suggerito molte ottime soluzioni qui, ma ho usato questa semplice tecnica con il mio EditText (non è richiesto nulla in java e AnroidManifest.xml). Basta impostare focusable e focusableInTouchMode su false direttamente su 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"/>

Il mio intento qui è utilizzare questa casella di modifica nell'attività di blocco app in cui chiedo all'utente di inserire il PIN e desidero mostrare il mio blocco PIN personalizzato. Testato con minSdk = 8 e maxSdk = 23 su Android Studio 2.1

inserisci qui la descrizione dell'immagine


questo ha reso la mia vita facile stackoverflow.com/questions/9577304/...
Mohammed Mansoor

20

Aggiungi sotto il codice sulla tua classe di attività.

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

La tastiera verrà visualizzata quando l'utente fa clic su EditText


10

È possibile utilizzare il codice seguente per disabilitare la tastiera su schermo.

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

1
e posso abilitarlo di nuovo usando EditText.onClick (im.unhideSoftInputFromWindow (editText.getWindowToken (), 0);) o qualcosa del genere ??
Mosca domestica

8

Due semplici soluzioni:

La prima soluzione viene aggiunta sotto la riga di codice nel file manifest xml. Nel file Manifest (AndroidManifest.xml), aggiungi il seguente attributo nel costrutto dell'attività

android: windowSoftInputMode = "stateHidden"

Esempio:

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

La seconda soluzione sta aggiungendo sotto la riga di codice in attività

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

Possiamo usare qualsiasi soluzione di cui sopra. Grazie


5

Dichiarare la variabile globale per InputMethodManager:

 private InputMethodManager im ;

Sotto onCreate () definiscilo:

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

Imposta onClickListener su quel testo di modifica all'interno di oncreate ():

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

Questo funzionerà.


Inserisci il tuo codice. Cosa ottieni mentre esegui.
AndroGeek

tutto il codice è nella domanda, la tastiera su schermo non viene visualizzata quando clicco sul testo di modifica
Mosca domestica

Lo stai testando utilizzando un emulatore o un dispositivo. Se lo stai provando usando un emulatore, non otterrai i softkey. Provalo utilizzando un dispositivo. Funzionerà.
AndroGeek

sì, sto usando un dispositivo per testare
Mosca domestica

Hmmm è strano. Se potessi pubblicare il tuo codice, il metodo in cui hai scritto, potrebbe esserti di aiuto. Oppure il codice sopra funziona perfettamente nel mio dispositivo.
AndroGeek

4

Usa il codice seguente, scrivilo sotto 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);

4

provalo ....... risolvo questo problema usando il codice: -

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);
}

niente che puoi inserire dalla calcolatrice predefinita su qualsiasi cosa, ma puoi impostare qualsiasi stringa.

Provalo


3

Grazie @AB per la buona soluzione

    android:focusableInTouchMode="false"

in questo caso, se disabiliti la tastiera nella modifica del testo, aggiungi semplicemente android: focusableInTouchMode = "false" nello slogan edittext.

lavora per me in Android Studio 3.0.1 minsdk 16, maxsdk26


1
È un commento alla A.Brisposta di s? O è una risposta alla domanda originale? Se si tratta di un commento alla A.Brisposta, è necessario utilizzare l'opzione di commento fornita da StackOverflow ed eliminare questa risposta alla domanda originale.
David Walschots

scusa se non ho capito di rispondere alla risposta risolta. dico grazie ad AB per una buona risposta per risolvere il mio problema .. se sbaglio, posso cancellare quella risposta, mi dispiace @DavidWalschots.
NZXT

2

Prova con questo:

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

Per chiudere puoi usare:

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

Provalo in questo modo nel tuo codice:

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);  
    }
});

funziona allo stesso modo di prima .... ci sono cambiamenti che devo fare nel layout ??? per questa vista EditText ??
Mosca domestica

ok, ora funziona dopo aver aggiunto alcuni attributi di layout ... android: clickable = "true" android: cursorVisible = "false" android: focusable = "false" grazie
Housefly

no. fai una cosa. scrivi il codice per nascondere il codice della tastiera nel metodo edittext.setOnFocusChangeListener () e prova
user1213202

questa sarebbe la soluzione SE si potesse specificare esattamente quando usare la chiamata a hideSoftInput. la tastiera si apre automaticamente DOPO onCreate e onResume
ahmet emrah

2

L'unica cosa che devi fare è aggiungere android:focusableInTouchMode="false"a EditText in xml e questo è tutto (se qualcuno ha ancora bisogno di sapere come farlo in modo semplice)


2

Bene, ho avuto lo stesso problema e ho affrontato il focusable nel file XML.

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

Probabilmente stai anche cercando sicurezza. Questo aiuterà anche in questo.


1

Usa il seguente codice nel tuo onCreate()metodo-

    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);

1

Per gli utenti Xamarin:

[Activity(MainLauncher = true, 
        ScreenOrientation = ScreenOrientation.Portrait, 
        WindowSoftInputMode = SoftInput.StateHidden)] //SoftInput.StateHidden - disables keyboard autopop

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"/>

1

Se stai usando Xamarin puoi aggiungerlo

Activity[(WindowSoftInputMode = SoftInput.StateAlwaysHidden)]

successivamente è possibile aggiungere questa riga nel metodo OnCreate ()

youredittext.ShowSoftInputOnFocus = false;

Se il dispositivo di destinazione non supporta il codice precedente, è possibile utilizzare il codice seguente nell'evento clic EditText

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

1

Ho trovato che il seguente modello funziona bene per me nel codice in cui voglio mostrare una finestra di dialogo per ottenere l'input (ad esempio, la stringa visualizzata nel campo di testo è il risultato di selezioni effettuate da un elenco di caselle di controllo in una finestra di dialogo, piuttosto che testo inserito tramite tastiera).

  1. Disabilita il soft input focus sul campo di modifica. Non posso disabilitare l'intera attività, poiché ci sono campi di modifica per i quali desidero che la tastiera venga utilizzata nello stesso layout.
  2. I clic iniziali nel campo di testo producono una modifica dello stato attivo, un clic ripetuto produce un evento clic. Quindi sovrascrivo entrambi (qui non eseguo il refactoring del codice per illustrare che entrambi i gestori fanno la stessa cosa):

    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");
            }
        });
    }
    

0

In un'app Android che stavo costruendo, avevo tre EditTexts LinearLayoutdisposti orizzontalmente. Ho dovuto impedire la visualizzazione della tastiera virtuale durante il caricamento del frammento. Oltre all'impostazione focusablee focusableInTouchModeal true su LinearLayout, ho dovuto impostare descendantFocusabilitysu blocksDescendants. In onCreate, ho chiamato requestFocusil LinearLayout. Ciò ha impedito la visualizzazione della tastiera durante la creazione del frammento.

Disposizione -

    <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>

In onCreate-mTextSelectorContainer.requestFocus();


0

Se qualcuno sta ancora cercando la soluzione più semplice, imposta il seguente attributo truesu nel layout principale

android:focusableInTouchMode="true"

Esempio:

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

.......
......
</android.support.constraint.ConstraintLayout>

votanti, commentate le vostre argomentazioni prima di votare!
Ajmal Salim

0

Usa questo per abilitare e disabilitare 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;
    }

0

Prova questa risposta,

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

Nota: solo per API 11+


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;
}

-1

per qualsiasi visualizzazione di testo nella tua attività (o crea una falsa visualizzazione di testo vuota con android: layout_width = "0dp" android: layout_height = "0dp") e aggiungi per questa visualizzazione di testo successiva: android: textIsSelectable = "true"


-1

Semplice, rimuovi semplicemente il tag "" dal file xml


2
Per favore, puoi approfondire questo e mostrare un esempio. Si prega di vedere come rispondere .
Bug il

-1

Basta aggiungere proprietà android:focusable="false"in particolare EditTextnel layout xml. Quindi puoi scrivere un elenco di clic EditTextsenza popup della tastiera.


-1

Il problema può essere ordinato utilizzando, Non è necessario impostare editText inputType su alcun valore, basta aggiungere la riga sottostante, editText.setTextIsSelectable (true);


Ehi, grazie per aver scritto una risposta! Tuttavia, poiché ci sono già così tante risposte qui, potrebbe essere ancora più utile se lo scrivessi effettivamente come un commento sulla risposta di Ranjith Kumar invece di farne la sua risposta. Potrebbe anche essere interessante menzionare quale sarebbe l'effetto di tralasciare il inputType. Ma sembra che sarebbe bene sapere se fossi andato con l'altra risposta, quindi anche se insisti a tenerlo in giro come risposta a se stante, ti preghiamo di lasciare un commento comunque.
Mark
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.