Wie deaktiviere ich das Popup der Tastatur, wenn ich auf edittext bin?

84

In meiner App ist die erste Ansicht aller meiner Bildschirme ein EditText. Jedes Mal, wenn ich zu einem Bildschirm gehe, wird die Bildschirmtastatur angezeigt. Wie kann ich dieses Popup deaktivieren und aktivieren, wenn ich manuell auf den EditText klicke?

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

XML-Code:

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

In der dritten Ansicht (EditText) liegt der Fokus.

Stubenfliege
quelle
Kannst du deinen XML-Code posten?
user1213202

Antworten:

177

Die beste Lösung liegt in der Project Manifest-Datei (AndroidManifest.xml). Fügen Sie dem activityKonstrukt das folgende Attribut hinzu

android: windowSoftInputMode = "stateHidden"


Beispiel:

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

Beschreibung:

  • Der Status der Softtastatur - ob ausgeblendet oder sichtbar -, wenn die Aktivität im Mittelpunkt der Aufmerksamkeit des Benutzers steht.
  • Die am Hauptfenster der Aktivität vorgenommene Anpassung - ob die Größe verkleinert wird, um Platz für die Softtastatur zu schaffen, oder ob der Inhalt schwenkt, um den aktuellen Fokus sichtbar zu machen, wenn ein Teil des Fensters von der Softtastatur abgedeckt wird.

Eingeführt in:

  • API Level 3.

Link zu den Dokumenten

Hinweis: Die hier festgelegten Werte (außer "stateUnspecified" und "adjustUnspecified") überschreiben die im Thema festgelegten Werte.

Skynet
quelle
3
Dieser Ansatz schlägt fehl, wenn Sie eine Mischung aus Textfeldern in der Aktivität haben, für die Sie eine Tastatur haben möchten, für andere nicht. In meiner Antwort erfahren Sie, wie dies in einem solchen Szenario auf Textfeldbasis erreicht werden kann.
Slogan 621
@ slogan621Bitte nehmen Sie sich einen Moment Zeit, um die Frage hier zu verstehen. Du bist auf einer anderen Tangente!
Skynet
Es funktioniert nicht, wenn ich meine App von vor kurzem öffne.
Mohd Naushad
83

Sie müssen über dem EditText eine Ansicht erstellen, die einen "falschen" Fokus hat:

Etwas wie :

<!-- 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 diesem Fall habe ich ein LinearLayout verwendet, um den Fokus anzufordern. Hoffe das hilft.

Das hat perfekt funktioniert ... dank Zaggo0

Stubenfliege
quelle
26
Das Hinzufügen einer nutzlosen Ansicht ist eine suboptimale Lösung im Vergleich zum Hinzufügen von android: windowSoftInputMode = "stateHidden" zum Manifesteintrag der Aktivität.
Chris Horner
@ChrisHorner in beiden Fällen müssen Sie für Aktivität oder Layout angeben ... ist die gleiche nervige Sache .. beide funktionieren gut für diese Lösung.
Nicolas Jafelle
2
Ich habe alle Lösungen ausprobiert und diese ist die einzige, die richtig funktioniert! danke klar und einfach
alfo888_ibg
Das Hinzufügen einer nutzlosen Ansicht ist keine gute Idee, wie @ChrisHorner gesagt hat. Fügen Sie besser ein Attribut in die Manifest-Datei ein, wie von ihm vorgeschlagen, oder fügen Sie diese Codezeile in Ihre Aktivität ein InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
aB9
1
So eine schlechte Implementierung der View-Hierarchie! Ich denke, dies sollte nach Möglichkeit vermieden werden.
Sud007
42
     edittext.setShowSoftInputOnFocus(false);

Jetzt können Sie jede beliebige benutzerdefinierte Tastatur verwenden.

Matthew556
quelle
Danke, dies ist die einzige Lösung, die für mich funktioniert + es ist kurz und einfach.
Max O.
20
Es ist verfügbar von API Level 21
Jithu PS
Das habe ich gesucht.
Sanjay Joshi
@ JithuP.S, warum funktioniert es auf Karbon Titan, dessen API-Level 19 ist?
15 漢子
23

Die Leute haben hier viele großartige Lösungen vorgeschlagen, aber ich habe diese einfache Technik mit meinem EditText verwendet (nichts in Java und AnroidManifest.xml ist erforderlich). Setzen Sie einfach Ihren fokussierbaren und fokussierbarenInTouchMode direkt in EditText auf false.

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

Ich möchte dieses Bearbeitungsfeld in der App-Sperraktivität verwenden, in der ich den Benutzer auffordere, die PIN einzugeben, und mein benutzerdefiniertes PIN-Pad anzeigen möchte. Getestet mit minSdk = 8 und maxSdk = 23 unter Android Studio 2.1

Geben Sie hier die Bildbeschreibung ein

AB
quelle
Dies machte mir das Leben leicht stackoverflow.com/questions/9577304/…
Mohammed Mansoor
20

Fügen Sie den folgenden Code zu Ihrer Aktivitätsklasse hinzu.

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

Die Tastatur wird angezeigt, wenn der Benutzer auf den EditText klickt

Sonia John Kavery
quelle
9

Sie können den folgenden Code zum Deaktivieren der OnScreen-Tastatur verwenden.

InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Luzifer
quelle
1
und ich kann es wieder aktivieren, indem ich EditText.onClick (im.unhideSoftInputFromWindow (editText.getWindowToken (), 0);) oder so etwas verwende?
Stubenfliege
8

Zwei einfache Lösungen:

Die erste Lösung wird unterhalb der Codezeile in der XML-Manifestdatei hinzugefügt. Fügen Sie in der Manifest-Datei (AndroidManifest.xml) das folgende Attribut zum Aktivitätskonstrukt hinzu

android: windowSoftInputMode = "stateHidden"

Beispiel:

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

Die zweite Lösung ist das Hinzufügen der folgenden Codezeile in der Aktivität

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

Wir können jede der oben genannten Lösungen verwenden. Vielen Dank

kgsharathkumar
quelle
5

Deklarieren Sie die globale Variable für InputMethodManager:

 private InputMethodManager im ;

Definieren Sie es unter onCreate ():

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

Setzen Sie den onClickListener auf diesen Bearbeitungstext in oncreate ():

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

Das wird funktionieren.

AndroGeek
quelle
Bitte posten Sie Ihren Code. Was bekommen Sie, während Sie ausführen.
AndroGeek
Der gesamte Code ist in der Frage, die Bildschirmtastatur wird nicht angezeigt, wenn ich auf den Bearbeitungstext
klicke
Testen Sie dies mit einem Emulator oder einem Gerät? Wenn Sie es mit einem Emulator versuchen, erhalten Sie die Softkeys nicht. Testen Sie es mit einem Gerät. Es wird klappen.
AndroGeek
Ja, ich benutze ein Gerät zum Testen
Housefly
Hmmm das ist komisch. Wenn Sie Ihren Code, die Methode, in der Sie geschrieben haben, veröffentlichen könnten, könnte dies hilfreich sein. Oder der obige Code funktioniert auf meinem Gerät absolut einwandfrei.
AndroGeek
4

Verwenden Sie den folgenden Code, schreiben Sie ihn unter 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
quelle
4

versuchen Sie es ....... ich löse dieses Problem mit Code: -

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

Sie können standardmäßig nichts für irgendetwas eingeben, aber Sie können eine beliebige Zeichenfolge festlegen.

Versuch es

SMFazle Rabbi
quelle
3

Danke @AB für die gute Lösung

    android:focusableInTouchMode="false"

In diesem Fall, wenn Sie die Tastatur im Text bearbeiten deaktivieren, fügen Sie einfach android: focusableInTouchMode = "false" in der edittext-Tagline hinzu.

arbeite für mich in Android Studio 3.0.1 minsdk 16, maxsdk26

NZXT
quelle
1
Ist das ein Kommentar zur A.BAntwort? Oder ist es eine Antwort auf die ursprüngliche Frage? Wenn dies ein Kommentar zur A.BAntwort ist, sollten Sie die von StackOverflow bereitgestellte Kommentaroption verwenden und diese Antwort auf die ursprüngliche Frage löschen.
David Walschots
Entschuldigung, wenn ich nicht verstanden habe, die gelöste Antwort zu beantworten. Ich bedanke mich bei AB für eine gute Antwort, um mein Problem zu lösen. Wenn ich mich irre, kann ich diese Antwort löschen, sorry @DavidWalschots.
NZXT
2

Versuchen Sie es damit:

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

Zum Schließen können Sie Folgendes verwenden:

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

Versuchen Sie es so in Ihrem Code:

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
quelle
es funktioniert genauso wie vorher .... sind die Änderungen, die ich am Layout vornehmen muss ??? für diese EditText-Ansicht?
Stubenfliege
Okay, jetzt funktioniert es nach dem Hinzufügen einiger Layout-Attribute ... android: clickable = "true" android: cursorVisible = "false" android: focusable = "false" Danke
Housefly
Schreiben Sie das Ausblenden des Tastaturcodes in die Methode edittext.setOnFocusChangeListener () und versuchen Sie es
user1213202
Dies wäre die Lösung, wenn Sie genau angeben könnten, wann der Aufruf von hideSoftInput verwendet werden soll. Die Tastatur erscheint automatisch nach onCreate und onResume
ahmet emrah
2

Nun, ich hatte das gleiche Problem und habe mich nur mit fokussierbar in der XML-Datei befasst.

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

Sie suchen wahrscheinlich auch nach Sicherheit. Dies wird auch dabei helfen.

Divyansh
quelle
1

Verwenden Sie den folgenden Code in Ihrer onCreate()Methode:

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

Das einzige, was Sie tun müssen, ist das Hinzufügen android:focusableInTouchMode="false"zum EditText in XML und das ist alles. (Wenn jemand noch wissen muss, wie man das auf einfache Weise macht)

Goldfisch
quelle
1

Für Xamarin-Benutzer:

[Activity(MainLauncher = true, 
        ScreenOrientation = ScreenOrientation.Portrait, 
        WindowSoftInputMode = SoftInput.StateHidden)] //SoftInput.StateHidden - disables keyboard autopop
Roy Doron
quelle
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
quelle
1

Wenn Sie Xamarin verwenden, können Sie dies hinzufügen

Activity[(WindowSoftInputMode = SoftInput.StateAlwaysHidden)]

Danach können Sie diese Zeile in der OnCreate () -Methode hinzufügen

youredittext.ShowSoftInputOnFocus = false;

Wenn das Zielgerät den obigen Code nicht unterstützt, können Sie den folgenden Code im EditText-Klickereignis verwenden

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

Ich fand, dass das folgende Muster für mich in Code gut funktioniert, in dem ich ein Dialogfeld anzeigen möchte, um die Eingabe zu erhalten (z. B. ist die im Textfeld angezeigte Zeichenfolge das Ergebnis einer Auswahl aus einer Liste von Kontrollkästchen in einem Dialogfeld und nicht über die Tastatur eingegebener Text).

  1. Deaktivieren Sie den weichen Eingabefokus im Bearbeitungsfeld. Ich kann nicht für die gesamte Aktivität deaktivieren, da es Bearbeitungsfelder gibt, für die die Tastatur im selben Layout verwendet werden soll.
  2. Erste Klicks im Textfeld führen zu einer Fokusänderung, ein wiederholtes Klicken zu einem Klickereignis. Also überschreibe ich beide (hier überarbeite ich den Code nicht, um zu veranschaulichen, dass beide Handler dasselbe tun):

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

In einer Android-App, die ich baute, hatte ich drei EditTexts in einer LinearLayouthorizontal angeordneten. Ich musste verhindern, dass die Softtastatur beim Laden des Fragments angezeigt wurde. Neben Einstellung focusableund focusableInTouchModetrue auf die LinearLayoutmusste ich Satz descendantFocusabilityzu blocksDescendants. In onCreaterief ich requestFocusdie LinearLayout. Dadurch wurde verhindert, dass die Tastatur beim Erstellen des Fragments angezeigt wird.

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>

In onCreate-mTextSelectorContainer.requestFocus();

Indyfromoz
quelle
0

Wenn noch jemand nach der einfachsten Lösung sucht, setzen Sie das folgende Attribut in trueIhrem übergeordneten Layout auf

android:focusableInTouchMode="true"

Beispiel:

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

.......
......
</android.support.constraint.ConstraintLayout>
Ajmal Salim
quelle
Wähler, bitte kommentieren Sie Ihre Argumente, bevor Sie abstimmen!
Ajmal Salim
0

Verwenden Sie diese Option, um EditText zu aktivieren und zu deaktivieren.

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

Versuchen Sie diese Antwort,

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

Hinweis: Nur für API 11+

Ranjith Kumar
quelle
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
quelle
-1

für jede Textansicht bei Ihrer Aktivität (oder erstellen Sie eine gefälschte leere Textansicht mit android: layout_width = "0dp" android: layout_height = "0dp") und fügen Sie für diese Textansicht als nächstes hinzu: android: textIsSelectable = "true"

Alex Artemenko
quelle
-1

Hinzufügen Eigenschaft Nur müssen android:focusable="false"insbesondere EditTextim Layout xml. Dann können Sie einen Klicklistener für EditTextohne Tastatur-Popup schreiben .

Sree
quelle
-1

Das Problem kann wie folgt sortiert werden: Keine Notwendigkeit, editText inputType auf Werte zu setzen. Fügen Sie einfach die folgende Zeile hinzu: editText.setTextIsSelectable (true);

arun
quelle
Hey, danke, dass du eine Antwort geschrieben hast! Da es hier jedoch bereits so viele Antworten gibt, ist es möglicherweise noch hilfreicher, wenn Sie dies tatsächlich als Kommentar zur Antwort von Ranjith Kumar geschrieben haben, anstatt es zu einer eigenen Antwort zu machen. Es könnte auch interessant sein zu erwähnen, wie sich das Weglassen des auswirken inputTypewürde. Aber es sieht so aus, als wäre es gut zu wissen, ob ich mich für diese andere Antwort entschieden habe. Selbst wenn Sie darauf bestehen, dies als eigene Antwort beizubehalten, sollten Sie trotzdem einen Kommentar hinterlassen.
Mark