Frage

In dem Layout können Sie die festlegen EditText Widget, um über die nicht eedierbar zu sein android:editable attribute.

Wie kann ich das im Code machen? Ich muss das machen EditText Widget, um je nach Bedingungen bearbeitet zu werden.

War es hilfreich?

Lösung

Ich denke an InputFilter Das Ablehnung aller Änderungen ist eine gute Lösung:

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

Bearbeiten: Dlazar schlug (unten) vor, die zu ändern return zu dst.subSequence(dstart, dend) Verhalten zu überwinden, das Wörter beseitigt.

Andere Tipps

editText.setFocusable(false);
editText.setClickable(false);

Dies sorgt für die EditText Die Kontrolle kann nicht ausgewählt und fokussiert werden, daher kann sie nicht bearbeitet werden.

Ich habe es gerade selbst ausprobiert,

Um Bearbeitungstext zu deaktivieren:

.setFocusable(false);

Dies setzt auch setFocuSableIntouchMode auf false!

So aktivieren Sie das Bearbeiten von Text:

setFocusableInTouchMode(true);

Dies setzt auch auf wahr;

Der beste Weg, dies zu tun, ist mit dieser einzelnen Codezeile:

textView.setKeyListener(null);

Die Dokumente sagen für diese Methode:

Legt den Schlüsselhörer mit dieser Textansicht fest. Dies kann null sein, um die Benutzereingabe zu vermeiden.

android:editable="false" 
android:inputType="none" 

in Ihrem XML oder

EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setEnabled(false);

oder

EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setKeyListener(null);

Sie können dies versuchen:

        mEditText.setFocusable(false);
        mEditText.setClickable(false);
        mEditText.setFocusableInTouchMode(false);
        mEditText.setLongClickable(false);
        mEditText.setInputType(InputType.TYPE_NULL);

Dadurch wird EditText vollständig deaktiviert und Long Press deaktiviert, wenn Sie nicht möchten, dass Benutzer Textoptionen bearbeiten.

Ich sehe keine verwandte Methode für dieses Attribut in der EditText -Klasse. Es gibt jedoch andere ähnliche Dinge, die Sie verwenden können, wie z.android:focus/setFocusable(boolean) oder erstellen Sie eine andere Textansicht, derenandroid:editable="false" und verwenden setVisiblilty() Um zwischen den bearbeitbaren und nicht bearbeitbaren Ansichten zu wechseln. Wenn du benutzt View.GONE Der Benutzer wird nie wissen, dass es zwei EditTexts gibt.

Wenn Sie sich ehrgeizig fühlen, könnten Sie wahrscheinlich etwas mit dem EditText tun onTextChanged Zuhörer, wie es mit einem reagiert setText.

Eine neue Antwort veröffentlichen, da ich die Antwort von Josef nicht kommentieren kann.

Der Eingabefilter funktioniert einwandfrei, enthält jedoch einen subtilen Fehler: Das Eingeben einer Auswahl löscht den gesamten Text.

Angenommen, Sie haben den Text "foo" in dem EditText. Wenn Sie alles auswählen (zB, indem Sie darauf klicken) und tippen 'a', Der Text wird verschwinden. Das liegt daran, dass die InputFilter wird als:

filter("a", 0, 1, "foo", 0, 3);

Der vorgeschlagene Eingabefilter gibt in diesem Fall die leere Zeichenfolge zurück (weil src.length() < 1 ist false), was den fehlenden Text erklärt.

Die Lösung besteht darin, einfach zurückzukehren dst.subSequence(dstart, dend) in der Filterfunktion. Dies wird auch für Löschungen gut funktionieren.

Hast du es versucht setText (java.lang.charsequence, android.widget.textview.buffertype) ? Es wird beschrieben als:

Legt den Text fest, den diese Textansicht anzeigen soll (siehe SetText (Charsequence)) und legt auch fest und ob es bearbeitbar ist.

(Hervorhebung meiner)

ich vermute

Edittext.setEnabled(false); 

durch Code

und

android:enabled="false"

über XML.Also überprüfen Sie diesen Beitrag auf ALSO.

Sie sollten funktionieren und Sie können wieder programmatisch aktivieren Edittext.setEnabled(true);

Ich wollte auch auf eine alternative Lösung hinweisen, die gut funktioniert, wenn Sie neue Instanzen einer EditView erstellen. Sie können die von den DOCs vorgeschlagene Methode GetDeFaultDeBled () überschreiben, um False zurückzugeben. Z.B

EditText view = new EditText(DiscountCalculator.this) {
    public boolean getDefaultEditable() {
        return false;
    }
};

Die einzige Lösung, die ich für dieses Szenario gefunden habe, ist das Erstellen von 2 Layouts. Einer ist bearbeitet und man ist nicht. Möglicherweise müssen Sie mehr als 2 Layouts basierend auf verschiedenen Bedingungen erstellen. Speichern Sie die Bedingungen in SharedPreferences oder anderen Mitteln und laden Sie das entsprechende Layout nach dem Neustart der Aktivität anhand der Bedingungen. Hier ist ein Beispiel:

in Oncreate () der Aktivität:

    configuration = new Configuration(this.getSharedPreferences(Configuration.SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE));
    manualSettingsMode = configuration.isManualSettingsMode();
    if(manualSettingsMode){
        setContentView(R.layout.editableconfigurationsettings);
    }else {
        setContentView(R.layout.configurationsettings);
    }

Die Aktivität kann anhand von Tests auf Bedingung und Aufrufen von Funktionen als:

private void setManualEditing(){
    configuration.set_isManualSettingsMode(true);
    this.recreate();
}

private void setAutoEditing(){
    configuration.set_isManualSettingsMode(false);
    this.recreate();
}

Hoffe das hilft. Es muss wirklich eine bessere Lösung geben, aber das habe ich getan. Im Idealfall könnte man dies auf einzelnen Feldern tun und die Aktivität / Layouts nicht neu laden. -Bobby

Ich denke, der richtige Weg, um den gewünschten Effekt zu erzielen, ist:

mEditView.setText("my text", BufferType.NORMAL);

Wenn Sie zwischen bearbeitbar und nicht eedierbar wechseln möchten, können Sie Folgendes tun:

// Switch to non-editable
mEditView.setText(mEditView.getText(), BufferType.NORMAL);

// Switch back to editable
mEditView.setText(mEditView.getText(), BufferType.EDITABLE);

Versuche dies:

 mEditText.setFilters(new InputFilter[]{new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (XXX) {
                return "";
            } else {
                return null;
            }
        }
    }});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top