Machen Sie EditText ReadOnly

119

Ich möchte eine schreibgeschützte EditTextAnsicht erstellen. Das XML für diesen Code scheint zu sein android:editable="false", aber ich möchte dies im Code tun.

Wie kann ich das machen?

Warna
quelle
3
Es ist auch erwähnenswert, dass android:editablefür veraltet ist EditText.
Derek W
Der zuverlässigste Weg, dies zu tun, ist die Verwendung UI.setReadOnly(myEditText, true)aus dieser Bibliothek . Es müssen einige Eigenschaften festgelegt werden, die Sie im Quellcode überprüfen können .
Caw
3
Ja, Derek hat recht. Jetzt in XML sollten Sie android:inputType="none"undandroid:textIsSelectable="true"
Atul

Antworten:

135

Bitte benutzen Sie diesen Code ..

Edittext.setEnabled(false);
Nikhil
quelle
34
Dies wird nicht nur ‚Set‘ schreibgeschützt , sondern auch deaktiviert Scrollen und kopiert :-(
josef
1
Dies wird deaktiviert. Besonders für mehrzeiligen EditText nutzlos.
Atul
versuchen Sie dies aber Wert verloren?
fdurmus77
97

Wenn Sie setEnabled(false)dann editTextdeaktiviert aussehen würden (grau usw.). Möglicherweise möchten Sie den visuellen Aspekt Ihres Editors nicht ändern.

Ein weniger aufdringlicher Weg wäre zu verwenden setFocusable(false).

Ich glaube, dass dies Ihre Frage näher an Ihrer ursprünglichen Absicht beantwortet.

Flexo
quelle
8
Dies ist gut, aber der Benutzer kann immer noch in das Textfeld "Einfügen".
Xtrem
14
Das hat bei mir super funktioniert. Ich musste darauf klicken, damit ich setEnabled (false) nicht verwenden konnte. Um das Problem mit dem Einfügen zu umgehen, habe ich gerade android: longClickable = "false"
dt0
3
Wenn Sie setFocusable(false)(und sogar setFocusableInTouchMode(false)mit setClickable(false)) verwenden, können Sie den Wert Ihres editTextDrückens editTextfür einige hundert Millisekunden ändern und die PasteOption auswählen, es sei denn , die Systemzwischenablage ist leer. Ich habe es mit der neuesten verfügbaren API getestet, nämlich 23 .
patryk.beza
Dies funktioniert, ich kann scrollen und den Cursor nicht sehen.
Live-Liebe
28

In XMLGebrauch:

android:editable="false"

Als Beispiel:

<EditText
    android:id="@+id/EditText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:editable="false" />
MaxEcho
quelle
Laut Javadoceditable scheint das Attribut nicht veraltet zu sein (zumindest nicht ab API-Level 23).
Greg Brown
8
@ MichaelJung ist richtig. Sie müssen verwendenandroid:inputType="none"
Ata Iravani
1
Die Frage sucht nach einer Möglichkeit, die Bearbeitung durch Java-Code und nicht durch XML falsch zu machen!
Saeed Khalafinejad
7
Ich versuche es android:inputType="none"und die Daten können noch bearbeitet werden.
BlueMonkMN
24

Das funktioniert bei mir:

EditText.setKeyListener(null);
igorinov
quelle
5
Dies wäre gut gewesen, aber der Benutzer kann immer noch in das Feld "einfügen". Daumen hoch, obwohl das wie ein Hack aussieht. Ich wünschte, sie hätten eine setEditable () API.
Xtrem
15

Das Beste ist, TextViewstattdessen zu verwenden.

Egor
quelle
8
Laut seinem App-Flow muss er es möglicherweise manchmal bearbeitbar machen und in anderen nicht
Muhammed Refaat
15
editText.setInputType(InputType.TYPE_NULL);

Gemäß den Dokumenten dadurch verhindert, dass die Softtastatur angezeigt wird. Es verhindert auch das Einfügen, ermöglicht das Scrollen und ändert den visuellen Aspekt der Ansicht nicht. Dies verhindert jedoch auch das Auswählen und Kopieren des Texts in der Ansicht.

Aus meinen -tests setInputTypezu TYPE_NULLscheint funktional äquivalent zu dem abgeschrieben zu werden android:editable="false". Darüber hinaus android:inputType="none"scheint keine spürbare Wirkung zu haben.

Adrian Toman
quelle
Einverstanden, das funktioniert vorerst und wie Sie sagten, android:inputType="none"funktioniert es nicht mehr.
Goke Obasa
1
Leider verhindert dies nicht die Eingabe in das Feld, wenn die virtuelle Tastatur bereits geöffnet ist (dh der Benutzer tippt zuerst auf ein bearbeitbares Feld und dann auf dieses - die virtuelle Tastatur wird nicht geschlossen). Es verhindert auch nicht, dass Sie über eine externe Tastatur in das Feld eingeben.
jk7
11

android: editable = "false" ist veraltet. Daher können Sie es nicht verwenden, um den Bearbeitungstext schreibgeschützt zu machen.

Ich habe dies mit der folgenden Lösung gemacht. Hier habe ich benutzt

android: inputType = "keine"

android: textIsSelectable = "true"

android: focusable = "false"

Probieren Sie es aus :)

<EditText
         android:id="@+id/et_newsgpa_university"
         android:layout_height="wrap_content"
         android:layout_width="match_parent"
         android:hint="@string/hint_educational_institute"
         android:textSize="@dimen/regular_text"
         android:inputType="none"
         android:textIsSelectable="true"
         android:focusable="false"
         android:maxLines="1"
         android:imeOptions="actionNext"/>
Chanaka Fernando
quelle
Es ist nicht wirklich schreibgeschützt, Sie können in diesem Code immer noch Werte in edittext einfügen. android:enabled="false"kann eine gute Alternative sein.
eVader
7
editText.setEnabled(false);
editText.setFilters(new InputFilter[] { new InputFilter() {
    public CharSequence filter(CharSequence src, int start, int end,
            Spanned dst, int dstart, int dend) {
        return src.length() < 1 ? dst.subSequence(dstart, dend) : "";
    }
} });

Dadurch erhalten Sie einen nicht bearbeitbaren EditText-Filter. Sie müssen zuerst den gewünschten Text in das Feld editText einfügen und dann diesen Filter anwenden.

DArkO
quelle
2
Eine gute Lösung und weniger Codezeilen als ein TextWatcher. Auf diese Weise kann der Benutzer Text auswählen und kopieren, aber keinen Text durch Eingabe von oder CUT oder PASTE ändern. Die return-Anweisung kann auf justreturn dst.subSequence(dstart, dend);
jk7
Mein vorheriger Kommentar bezog sich nur auf die setFilters () -Anweisung, ohne das EditText-Feld zu deaktivieren.
jk7
Danke, dies ist die einzige Lösung, die für mich funktioniert! Es ist frustrierend, dass etwas, das funktioniert, abgeschrieben und durch etwas (inputType = "none") ersetzt wurde, das immer noch nicht funktioniert, und mit unerwünschten Nebenwirkungen (mehrzeilige Eingabe). Bitte beachten Sie, dass die von @ jk7 vorgeschlagene Änderung von entscheidender Bedeutung ist, da Sie bei der ursprünglichen return-Anweisung, wenn Sie einen Teil Ihres ursprünglichen Textes auswählen und etwas eingeben, den ausgewählten Text durch die vom Filter zurückgegebene leere Zeichenfolge ersetzen. In diesem Fall ist die src-Länge ungleich Null und die leere Zeichenfolge hat Wirkung.
Paul L
6

Das Schreiben dieser beiden Zeilen ist mehr als genug für Ihre Arbeit.

yourEditText.setKeyListener(null); 
yourEditText.setEnabled(false);
Vishal Pandey
quelle
Viel hilfreicher ist es, den Listener auf null zu setzen, als ihn zu deaktivieren.
Humberto Castañeda
5

in XML eingestellt

android:inputType="none" 
Jitendra Surve
quelle
Ich habe es versucht und das Ergebnis scheint immer noch bearbeitbar zu sein.
BlueMonkMN
3

Versuchen Sie es mit

editText.setEnabled(false);
editText.setClickable(false);
Kannappan
quelle
Dies ermöglicht es immer noch, fokussierbar zu sein, indem Sie die Tabulatortaste auf der Tastatur
drücken
3
android:editable

Wenn gesetzt, gibt dies an, dass dies TextVieweine Eingabemethode hat. Sofern nicht anders angegeben, handelt es sich um einen Text. Für TextView, ist dies standardmäßig falsch. Denn EditTextes ist standardmäßig wahr.

Muss ein booleanWert sein, entweder trueoder false.

Dies kann auch ein Verweis auf eine Ressource (im Formular @[package:]type:name) oder ein Themenattribut (im Formular ?[package:][type:]name) sein, die einen Wert dieses Typs enthält.

Dies entspricht dem bearbeitbaren globalen Attributressourcensymbol.

Verwandte Methoden

jclafuente
quelle
2

Versuchen Sie, den onLongClick-Listener des Bearbeitungstextes zu überschreiben, um das Kontextmenü zu entfernen:

EditText myTextField = (EditText)findViewById(R.id.my_edit_text_id);
myTextField.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        return true;
    }
});
Jimmy Ilenloa
quelle
3
Ich habe android: editable = "false" und android: focusable = "false" verwendet, dann onLongclick überschrieben und das gewünschte Ergebnis
erzielt
2

Verwenden Sie diesen Code:

editText.setEnabled(false);
editText.setTextColor(ContextCompat.getColor(context, R.color.black);

Deaktivieren editText wird ein schreibgeschütztes Erscheinungsbild das jedoch auch text-colorin Grau geändert wird , sodass die Textfarbe festgelegt werden muss.

Mary Garcia
quelle
Bitte fügen Sie auch einige Erklärungen hinzu.
BlackBeard
1

Dies ist meine Implementierung (etwas lang, aber nützlich für mich!): Mit diesem Code können Sie EditView schreibgeschützt oder normal machen. Selbst im schreibgeschützten Zustand kann der Text vom Benutzer kopiert werden. Sie können den Hintergrund ändern, damit er sich von einem normalen EditText unterscheidet.

public static TextWatcher setReadOnly(final EditText edt, final boolean readOnlyState, TextWatcher remove) {
    edt.setCursorVisible(!readOnlyState);
    TextWatcher tw = null;
    final String text = edt.getText().toString();
    if (readOnlyState) {
            tw = new TextWatcher();

            @Override
            public void afterTextChanged(Editable s) {

            }
            @Override
            //saving the text before change
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            // and replace it with content if it is about to change
            public void onTextChanged(CharSequence s, int start,int before, int count) {
                edt.removeTextChangedListener(this);
                edt.setText(text);
                edt.addTextChangedListener(this);
            }
        };
        edt.addTextChangedListener(tw);
        return tw;
    } else {
        edt.removeTextChangedListener(remove);
        return remove;
    }
}

Der Vorteil dieses Codes besteht darin, dass der EditText als normaler EditText angezeigt wird, der Inhalt jedoch nicht geändert werden kann. Der Rückgabewert sollte als Variable beibehalten werden, damit der schreibgeschützte Zustand wieder normal wird.

Um einen EditText schreibgeschützt zu machen, geben Sie ihn einfach wie folgt ein:

TextWatcher tw = setReadOnly(editText, true, null);

und um es normal zu machen, benutze tw aus der vorherigen Aussage:

setReadOnly(editText, false, tw);
Ali sh
quelle
1

Dies funktionierte für mich unter Berücksichtigung einiger der oben genannten Vorschläge. Macht das TextEdit fokussierbar, aber wenn der Benutzer klickt oder fokussiert, wird eine Liste mit Auswahlen in einem Popup-Fenster angezeigt. (Wir ersetzen das verrückte Spinner-Widget). TextEdit xml ist sehr allgemein ...

public void onCreate(Bundle savedInstanceState) {
    ....  
    fEditState = (EditText) findViewById(R.id.state_edit);

    fEditState.setLongClickable(false);
    fEditState.setKeyListener(null);
    fEditState.setFocusable(true);

    fEditState.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus)
        {
            if (hasFocus)
            {
               showStatesPopup();

            }
        }
    });

    fEditState.setOnClickListener(new Button.OnClickListener(){

        public void onClick(View arg0)
        {
           showStatesPopup();
        }
    });
    ....
}

private void showStatesPopup()
{
    // fPopupWindowStates instantiated in OnCreate()

    if (!fPopupWindowStates.isShowing()) {
        // show the list view as dropdown
        fPopupWindowStates.showAsDropDown(fEditState, -5, 0);
    }
}  
Johnny O.
quelle
1

Wenn Sie nur in der Lage sein wollen , um Text von der Steuerung zu kopieren , aber nicht bearbeiten zu können , um es Sie vielleicht einen verwenden möchten Textview statt und Set Text ist frei wählbar .

Code:

myTextView.setTextIsSelectable(true);
myTextView.setFocusable(true);
myTextView.setFocusableInTouchMode(true);
// myTextView.setSelectAllOnFocus(true);

xml:

<TextView
    android:textIsSelectable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"     
    ...
/>
<!--android:selectAllOnFocus="true"-->


Die Dokumentation von setTextIsSelectable lautet:

Wenn Sie diese Methode aufrufen, um den Wert von textIsSelectable festzulegen, werden die Flags focusable, focusableInTouchMode, clickable und longClickable auf denselben Wert gesetzt ...

Allerdings musste ich focusable und focusableInTouchMode explizit auf true setzen, damit es mit Berührungseingaben funktioniert.

AJBauer
quelle
1

Dies war die einzige einfache Lösung für mich.

editText.setEnabled(false);   // Prevents data entry
editText.setFocusable(false); // Prevents being able to tab to it from keyboard
AlanKley
quelle
0

Ich hatte kein Problem damit, EditTextPreference schreibgeschützt zu machen, indem ich Folgendes verwendete:

editTextPref.setSelectable(false);

Dies funktioniert gut, wenn das Feld "Zusammenfassung" zum Anzeigen schreibgeschützter Felder verwendet wird (nützlich zum Beispiel zum Anzeigen von Kontoinformationen). Das dynamische Aktualisieren der Zusammenfassungsfelder wurde von http://gmariotti.blogspot.com/2013/01/preferenceactivity-preferencefragment.html abgerufen

private static final List<String> keyList;

static {
    keyList = new ArrayList<String>();
    keyList.add("field1");
    keyList.add("field2");
    keyList.add("field3");
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);

    for(int i=0;i<getPreferenceScreen().getPreferenceCount();i++){
        initSummary(getPreferenceScreen().getPreference(i));
    }
}

private void initSummary(Preference p) {
    if (p instanceof PreferenceCategory) {
        PreferenceCategory pCat = (PreferenceCategory) p;
        for (int i = 0; i < pCat.getPreferenceCount(); i++) {
            initSummary(pCat.getPreference(i));
        }
    } else {
        updatePrefSummary(p);
    }
}

private void updatePrefSummary(Preference p) {
    if (p instanceof ListPreference) {
        ListPreference listPref = (ListPreference) p;
        p.setSummary(listPref.getEntry());
    }
    if (p instanceof EditTextPreference) {
        EditTextPreference editTextPref = (EditTextPreference) p;
        //editTextPref.setEnabled(false); // this can be used to 'gray out' as well
        editTextPref.setSelectable(false);
        if (keyList.contains(p.getKey())) {
            p.setSummary(editTextPref.getText());
        }
    }
}
Jason Harmon
quelle
0

Stellen Sie dies in der EdiTextView-XML-Datei ein

android:focusable="false"
Nandakishore Shetty
quelle
1
In der Frage wird gefragt, wie es programmgesteuert schreibgeschützt und nicht in XML erstellt werden soll.
jk7
0

Wie android:editable=""veraltet,

Einstellung

  • android:clickable="false"
  • android:focusable="false"
  • android:inputType="none"
  • android:cursorVisible="false"

macht es "schreibgeschützt".

Benutzer können jedoch weiterhin in das Feld einfügen oder andere Aktionen mit langen Klicks ausführen. Um dies zu deaktivieren, überschreiben Sie einfach onLongClickListener ().
In Kotlin:

  • myEditText.setOnLongClickListener { true }

genügt.

Chad Mx
quelle
0

Mein Ansatz hierfür war das Erstellen einer benutzerdefinierten TextWatcher-Klasse wie folgt:

class ReadOnlyTextWatcher implements TextWatcher {
    private final EditText textEdit;
    private String originalText;
    private boolean mustUndo = true;

    public ReadOnlyTextWatcher(EditText textEdit) {
        this.textEdit = textEdit;
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if (mustUndo) {
            originalText = charSequence.toString();
        }
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (mustUndo) {
            mustUndo = false;
            textEdit.setText(originalText);
        } else {
            mustUndo = true;
        }
    }
}

Dann fügen Sie diesen Watcher einfach zu jedem Feld hinzu, das trotz Aktivierung schreibgeschützt werden soll:

editText.addTextChangedListener(new ReadOnlyTextWatcher(editText));
Fran Marzoa
quelle