Deaktivieren von EditText in Android


195

In meiner Anwendung habe ich einen EditText, für den der Benutzer nur Lesezugriff und keinen Schreibzugriff hat.

Im Code habe ich gesetzt android:enabled="false".

Obwohl der Hintergrund von EditText dunkel wurde, wird beim Klicken die Tastatur angezeigt und ich kann den Text ändern.

Was soll ich einstellen, um EditText zu deaktivieren?


2
Es ist möglich, sowohl den Stil der Ansicht als auch das Bildlaufverhalten beizubehalten. Eine zu deaktivieren , EditTextwährend diese Eigenschaften zu halten, benutzen Sie einfach UI.setReadOnly(myEditText, true)aus dieser Bibliothek . Wenn Sie dieses Verhalten ohne die Bibliothek replizieren möchten, lesen Sie den Quellcode für diese kleine Methode.
Caw

Antworten:


245

Ich glaube das richtige wäre zu setzen android:editable="false".

Und wenn Sie sich fragen, warum mein Link auf die Attribute von TextViewverweist, lautet die Antwort, weil EditTexterbt von TextView:

EditText ist ein dünnes Furnier über TextView, das sich selbst als bearbeitbar konfiguriert.

Update:
Wie in den Kommentaren unten erwähnt, editableist es veraltet ( seit API-Level 3 ). Sie sollten stattdessen inputType(mit dem Wert none) verwenden.


danke Nailuj, leider hat es nicht funktioniert. Nach dem Hinzufügen Ihres Vorschlags wird die Tastatur angezeigt und der Text kann geändert werden.
Hesam

17
android: editierbar ist veraltet. android: inputType = "none" sollte stattdessen verwendet werden, aber es enthält einen Fehler und funktioniert nicht. Es wäre schön, wenn wir alle das Problem hier ansprechen würden
Viktor Brešan

85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
Asymptote

28
android:editable="false" android:focusable="false"funktioniert gut für mich (vergessen Sie veraltet, ich denke, Android: editierbar hat nichts mit Android: inputType zu tun)
Muhammad Babar

8
Für alle, für die android: inputType = "none" nicht funktioniert, versuchen Sie: android: inputType = "none" mit android: focusable = "false"
Surendra Kumar

161

Verwenden Sie EditText.setFocusable(false) diese Option
EditText.setFocusableInTouchMode(true), um die Bearbeitung zu deaktivieren und die Bearbeitung zu aktivieren.


Es funktioniert, aber es ist keine gute Vorgehensweise, da die Ansicht so aussieht, als könne sie bearbeitet werden, aber nicht. Hat für mich gut funktioniert, da meine Ansicht einen benutzerdefinierten Hintergrund hatte, also +1.
Kaneda

4
@kaneda. Ich bevorzuge das eigentlich. Ich möchte nicht, dass meine Box ausgegraut ist. :)
Doomsknight

1
In Android 4.4 behält diese Option die ursprüngliche Textfarbe bei. Mit editText.setEnabled(false);wird die Textfarbe in Grau geändert. Spinner ändern jedoch die Textfarbe bei der Verwendung nicht setEnabled, was zu einer inkonsistenten Erfahrung führt.
Tbraun

warum nicht setFocusable(true)? Siehe diesen Link für den Unterschied zwischen setFocusable()und setFocusableInTouchMode(): stackoverflow.com/questions/23799064/…
Kenju

Das passte wirklich zu meinen Bedürfnissen. Ich habe eine zusammengesetzte benutzerdefinierte Ansicht mit einem darin enthaltenen EditText erstellt. Ich habe Probleme, die benutzerdefinierte Ansicht so zu gestalten, dass nur Klicks akzeptiert, aber nicht bearbeitet werden können, da dadurch ein Dialogfeld zur Datumsauswahl gestartet wird. Diese Lösung funktioniert, da sie onClickListeners
Neon Warge

64

Sie können die folgende Methode ausprobieren:

 private void disableEditText(EditText editText) {
    editText.setFocusable(false);
    editText.setEnabled(false);
    editText.setCursorVisible(false);
    editText.setKeyListener(null);
    editText.setBackgroundColor(Color.TRANSPARENT); 
 }

EditText aktiviert:

EditText aktiviert

EditText deaktiviert:

EditText deaktiviert

Es funktioniert für mich und hoffe, es hilft Ihnen.


1
Dies sieht aus wie eine Textansicht. Es ist so erstaunlich. Das suche ich.
Yunus

4
Falls jemand das gleiche Problem mit der Aktivierung der Rückmeldung hat, müssen Sie editText.setFocusableInTouchMode(true)stattdessen anrufen editText.setFocusable(true).
Dart Dega

61

Verwenden Sie diese Option, um Benutzereingaben zu deaktivieren

android:focusable="false"

android: editable = "false" Diese Methode ist veraltet.


1
Dies sollte die akzeptierte Antwort sein. Das Setzen des Eingabetyps auf "keine", wie in anderen Antworten vorgeschlagen, funktioniert (immer) nicht. Die Einstellung 'false' verhindert das Bearbeiten, dimmt aber auch den gewünschten Text ab oder nicht.
Jerry

36

Für disable bearbeiten EditText, ich denke , wir verwenden können focusable oder enable aber

  1. Verwenden von android:enabled=...odereditText.setEnabled(...)

    Außerdem wird die Textfarbe in EditTextGrau geändert .
    Wenn Sie darauf klicken, hat dies keine Auswirkung

  2. Verwenden von android:focusable=...oder editText.setFocusable(false)-editText.setFocusableInTouchMode(true)

    Es ändert sich nicht , Textfarbe EditText
    Wenn angeklickt haben die Highlights EditTextunterm Strich für etwa einige Millisekunden

Ausgabe

Geben Sie hier die Bildbeschreibung ein


19

Wie android:editable="false"ist depricated.You Input verwenden können TYPE_NULL auf EditText

Verwendung wie folgt:

editText.setInputType(InputType.TYPE_NULL);

1
Diese Antwort hat mir gefallen, weil sie den onClickListener auf dem Feld nicht deaktiviert.
Harsh Ganatra

Was tun, wenn der inputType ein Kennwort ist? TYPE_NULL macht das Passwort sichtbar.
Ilyamuromets

17

Wie android:editable="false"veraltet inxml

Verwenden Sie android:enabled="false"es ist einfach. Warum mehr Code verwenden?

Wenn Sie möchten java class, können Sie dies auch programmgesteuert verwenden

 editText.setEnabled(false);

benutze android: enabled = "true" für enable
android_jain

8

Einfach:

editText.setEnabled(false);

1
Wie unterscheidet es sich von der vorherigen Antwort (also als Frage)?
Onik

Mit setFocusable (false) können Sie auch einen OnClickListener festlegen.
Oded Breiner

5

Legen Sie die folgenden Eigenschaften in der Klasse fest:

editText.setFocusable(false);
editText.setEnabled(false);

Es wird reibungslos funktionieren, wie Sie es benötigen.


nur enabledwar ausreichend
ateebahmed

5

Um die Funktionalität eines EditText zu deaktivieren, verwenden Sie einfach:

EditText.setInputType(InputType.TYPE_NULL);

Wenn Sie es auf irgendeine Weise aktivieren möchten, können Sie Folgendes verwenden:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

Was tun, wenn der inputType ein Kennwort ist? TYPE_NULL macht das Passwort sichtbar.
Ilyamuromets

4

Wenn Sie verwenden android:editable="false", erinnert Sie Eclipse an die Meldung "android: editierbar ist veraltet: Verwenden Sie stattdessen inputType".

Also benutze ich android:focusable="false"stattdessen, es hat gut für mich funktioniert.


4
android:editable="false"

ist jetzt veraltet und verwenden

 YourEditText.setInputType(InputType.TYPE_NULL);

Was tun, wenn der inputType ein Kennwort ist? TYPE_NULL macht das Passwort sichtbar.
Ilyamuromets

@ilyamuromets Diese Antwort könnte stackoverflow.com/a/16720520/7704650 mit TYPE_TEXT_VARIATION_PASSWORDfolgen. Folgen Sie diesem für weitere Entwickler.android.com/reference/android/text/InputType
emkarachchi

Ich möchte die Eingabe im EditText deaktivieren, während die Softtastatur geöffnet ist und der Benutzer versucht, Text einzugeben. InputType.TYPE_NULL funktioniert hervorragend mit isFocusable und isFocusableInTouchMode mit falschem Wert. Wenn inputType des Eingabefelds jedoch textPassword ist, macht InputType.TYPE_NULL den Kennwortwert sichtbar. Wenn ich InputType.TYPE_NULL | setze InputType.TYPE_TEXT_VARIATION_PASSWORD, dann wird auch das Passwort sichtbar und der Benutzer kann Text eingeben.
Ilyamuromets


3

Deaktivieren = FOCUS + CLICK + CURSOR

Das Deaktivieren der Fokus-, Klick- und Cursorsichtbarkeit macht den Trick für mich.

Hier ist der Code in XML

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

2

Dadurch wird Ihr Edittext deaktiviert .

editText.setEnabled(false);

Und damit

editText.setInputType(InputType.TYPE_NULL);

Ihr Edittext zeigt nur nicht Ihr Softkeyboard an , aber wenn es mit einer physischen Tastatur verbunden ist, können Sie tippen.


Was tun, wenn der inputType ein Kennwort ist? TYPE_NULL macht das Passwort sichtbar.
Ilyamuromets

2

Ich verwende die neu veröffentlichte Material Design Library von Google. In meinem Fall funktioniert es, wenn ich android: focusable = "false" und android: cursorVisible = "false" verwende.

<com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/to_time_input_layout"
                    app:endIconMode="custom"
                    app:endIconDrawable="@drawable/ic_clock"
                    app:endIconContentDescription="ToTime"
                    app:endIconTint="@color/colorAccent"
                    style="@style/OutlinedEditTextStyle"
                    android:hint="To Time">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/to_time_edit_text"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:focusable="false"
                        android:cursorVisible="false" />

</com.google.android.material.textfield.TextInputLayout>

1

In meinem Fall musste ich meinen EditTextText scrollen, wenn nein. Anzahl der Zeilen überschreitet, maxLineswenn es deaktiviert ist. Diese Implementierung hat bei mir perfekt funktioniert.

private void setIsChatEditTextEditable(boolean value)
{
    if(value)
    {
        mEdittext.setCursorVisible(true);
        mEdittext.setSelection(chat_edittext.length());
       // use new EditText(getApplicationContext()).getKeyListener()) if required below
        mEdittext.setKeyListener(new AppCompatEditText(getApplicationContext()).getKeyListener());  
    }
    else
    {
        mEdittext.setCursorVisible(false);
        mEdittext.setKeyListener(null);
    }
}

1

Versuchen Sie dieses, funktioniert gut für mich:

public class CustomEdittext extends EditText {

Boolean mIsTextEditor=true;
public CustomEdittext(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

@Override
public boolean onCheckIsTextEditor() {
    // TODO Auto-generated method stub
    return mIsTextEditor;
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    mIsTextEditor=false;
    Boolean mOnTouchEvent=super.onTouchEvent(event);
    mIsTextEditor=true;     
    return mOnTouchEvent;
} }

Hinweis: Sie müssen hinzufügen this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); auf Ihre Aktivität oder sonst keyboardwird Popup zum ersten Mal.


1

Wie einige Antworten erwähnen, wird der Cursor angezeigt, wenn Sie den editText deaktivieren und wenn Sie fokussierbar auf false setzen.

Wenn Sie es nur mit XML machen möchten, hat dies den Trick getan

       <YourFloatLabel
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

            <EditText
                android:id="@+id/view_ads_search_select"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusable="true"
                android:clickable="true"/>  
       </YourFloatLabel>

Ich füge einfach ein FrameLayout hinzu, das über dem editText angezeigt wird, und setze es fokussierbar und anklickbar, damit der editText nicht angeklickt werden kann.


0

Das funktioniert bei mir:

android: focusable = "false"


2
Wie unterscheidet sich das von dem, was Sampath Kumar vor 4 Jahren gepostet hat?
Gobrewers14

0

Verwenden Sie im Kommentar von @ Asymptote zur akzeptierten Antwort Folgendes:

myEditText.setEnabled(false);
myEditText.setInputType(InputType.TYPE_NULL);

... und Bob ist dein Onkel.


0

Heute benutze ich noch editable="false", aber auch mit focusable="false".

Ich denke, wir müssen einen EditText nicht bearbeitbar machen, weil wir seinen EditText-Stil beibehalten möchten (mit dieser Unterstreichung, mit Hinweisen usw.), aber andere Eingaben anstelle von Text akzeptieren. Zum Beispiel eine Dropdown-Liste.

In einem solchen Anwendungsfall müssen wir das EditTextanklickbare haben (ist also enabled="false"nicht geeignet). Wenn focusable="false"Sie diesen Trick ausführen , kann ich den EditText noch lange gedrückt halten und meinen eigenen Text aus der Zwischenablage einfügen . Abhängig von Ihrem Code und Ihrer Handhabung kann dies sogar zum Absturz Ihrer App führen.

Also habe ich auch benutzt editable="false"und jetzt ist alles super, bis auf die Warnung.


0

Sie können den android:focusable="false"Cursor verwenden , müssen ihn aber auch deaktivieren, da sonst die Funktion zum Kopieren / Einfügen weiterhin funktioniert.

also benutze

android:focusable="false"
android:cursorVisible="false"

0

Es gibt mehrere Möglichkeiten, um mehrere Ebenen von Behinderten zu erreichen.

  • editText.setShowSoftInputOnFocus(false); und editText.setFocusable

verhindert, dass die EditTextTastatur in einem Text angezeigt wird. Der Cursor ist jedoch weiterhin sichtbar und der Benutzer kann Text einfügen.

  • editText.setCursorVisible(false)

versteckt den Cursor. Ich bin mir nicht sicher, warum du das tun willst. Der Benutzer kann Text eingeben und einfügen.

  • editText.setKeyListener(null)

Ich finde diesen Weg am bequemsten. Es gibt keine Möglichkeit, wie Benutzer Text eingeben können, aber das Widget funktioniert weiterhin, OnClickListenerwenn Sie eine Aktion auslösen möchten, wenn der Benutzer sie berührt

  • editText.setEnabled(false);

vollständig deaktiviert EditText. Es ist buchstäblich schreibgeschützt, der Benutzer kann keinen Text eingeben und OnClickListener funktioniert (zum Beispiel) nicht damit.

TextEdit- Dokumentation


0

Stellen Sie dies in Ihrem XML-Code ein. Es funktioniert.

android: focusableInTouchMode = "false"

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.