Domanda

Nel layout è possibile impostare il EditText widget per non essere modificabili tramite il android:editable attribute.

Come posso farlo nel codice? Ho bisogno di fare il EditText Widget per essere modificabili a seconda delle condizioni.

È stato utile?

Soluzione

Penso che un InputFilter Ciò rifiuta tutte le modifiche è una buona soluzione:

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

Modificare: Dlazar ha suggerito (sotto) di cambiare il return a dst.subSequence(dstart, dend) per superare il comportamento che rimuove le parole.

Altri suggerimenti

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

questo garantisce il EditText Il controllo non può essere selezionato e focalizzato, quindi non può essere modificato.

L'ho appena provato

Per disabilitare il testo di modifica:

.setFocusable(false);

Questo imposta anche setfocusableIntOuchMode su False!

Per abilitare il testo di modifica:

setFocusableInTouchMode(true);

Questo imposta anche setfocusable su true;

Il modo migliore per farlo è con questa singola riga di codice:

textView.setKeyListener(null);

I documenti dicono per questo metodo:

Imposta l'ascoltatore chiave da utilizzare con questo TextView. Questo può essere nullo per non consentire l'input dell'utente.

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

nel tuo XML o

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

o

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

Puoi provare questo:

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

Questo disabiliterà completamente EditText, disabilita a lungo Premere se non si desidera che l'utente apra le opzioni di testo di modifica.

Non vedo un metodo correlato per quell'attributo nella classe EditText. Tuttavia, ci sono altre cose simili che potresti usare comeandroid:focus/setFocusable(boolean) o creare un altro TextView di cuiandroid:editable="false" e usa setVisiblilty() Per passare da una vista modificabile e non modificabile. Se usi View.GONE L'utente non saprà mai che ci sono due EditText.

Se ti senti ambizioso, potresti probabilmente fare qualcosa con il editText onTextChanged ascoltatore come averlo reagito con a setText.

Pubblicazione di una nuova risposta, dal momento che non posso commentare la risposta di Josef.

Il filtro di input funziona bene, ma ha un bug sottile in esso: la digitazione su una selezione eliminerà tutto il testo.

Ad esempio, supponiamo che tu abbia il testo "foo" nel EditText. Se selezioni tutto (ad esempio, facendo doppio clic su di esso) e digita 'a', il testo scomparirà. Questo perché il InputFilter sarà chiamato come:

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

Il filtro di input proposto restituirà la stringa vuota in questo caso (perché src.length() < 1 è false), che spiega il testo mancante.

La soluzione è semplicemente tornare dst.subSequence(dstart, dend) Nella funzione del filtro. Funzionerà bene anche per le eliminazioni.

Hai provato setText (java.lang.charsesese, Android.widget.textView.BufferType) ? È descritto come:

Imposta il testo che questo TextView deve visualizzare (vedere SetText (CharIsequence)) e imposta anche se è memorizzato in un buffer stilizzabile/spannable E se è modificabile.

(enfasi la mia)

credo

Edittext.setEnabled(false); 

tramite codice

e

android:enabled="false"

Attraverso XML. Controlla anche questo post su COSÌ.

Dovrebbero funzionare e puoi abilitare di nuovo programmaticamente Edittext.setEnabled(true);

Volevo anche sottolineare una soluzione alternativa che funziona bene se stai creando nuove istanze di EDITVIEW. È possibile sovrascrivere il metodo getDefaultEditable () come suggerito dai documenti per restituire False. Per esempio

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

L'unica soluzione che ho trovato per questo scenario è creare 2 layout. Uno è modificabile e uno no. Potrebbe essere necessario creare più di 2 layout in base a varie condizioni. Conservare le condizioni in preferenze condivise o altri mezzi e caricare il layout pertinente in base alle condizioni dopo il riavvio dell'attività. Ecco un esempio:

in oncreate () dell'attività:

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

L'attività può essere riavviata in base ai test per le condizioni di condizione e chiamate come:

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

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

Spero che sia di aiuto. Deve davvero esserci una soluzione migliore, ma questo è quello che ho fatto. Idealmente, si sarebbe in grado di farlo su singoli campi e non è necessario ricaricare l'attività / layout. -bobby

Penso che il modo corretto per raggiungere l'effetto desiderato sia:

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

Se vuoi passare da una modifica e non modificabile, puoi fare quanto segue:

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

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

prova questo:

 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;
            }
        }
    }});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top