wake-up-neo.com

EditText ReadOnly erstellen

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

Wie kann ich das machen?

99
warna

Bitte verwenden Sie diesen Code.

Edittext.setEnabled(false);
116
Nikhil

Wenn Sie setEnabled(false) wären, würde Ihre editText deaktiviert aussehen (grau usw.). Möglicherweise möchten Sie den visuellen Aspekt Ihres Editors nicht ändern. 

Ein weniger aufdringlicher Weg wäre die Verwendung von setFocusable(false).

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

90
user962247

In XML verwenden

Android:editable="false"

Beispiel:

<EditText
Android:id="@+id/EditText1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:editable="false" 
/>
27
Salim

Das funktioniert für mich:

EditText.setKeyListener(null);
20
igorinov

Am besten verwenden Sie stattdessen TextView.

14
Egor
editText.setInputType(InputType.TYPE_NULL);

Wie in den docs wird verhindert, dass die Soft-Tastatur 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 Textes innerhalb der Ansicht.

Von meinen Tests scheint setInputType bis TYPE_NULL funktional zu entsprechen, was dem herabgesetzten Android:editable="false" entspricht. Außerdem scheint Android:inputType="none" keine spürbare Wirkung zu haben.

10
Adrian Toman
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 editierbaren EditText-Filter. Sie müssen zuerst den gewünschten Text in das Feld editText einfügen und dann diesen Filter anwenden.

7
DArkO

in XML gesetzt

Android:inputType="none" 
5
Jitendra Surve

das Schreiben dieser zwei Zeilen ist mehr als genug für Ihre Arbeit.

yourEditText.setKeyListener(null); 
yourEditText.setEnabled(false);
5
Vishal Pandey

Versuchen Sie es mit

editText.setEnabled(false);
editText.setClickable(false);
4
kannappan

Android: editable = "false" wurde abgeschrieben. Daher können Sie es nicht verwenden, um den Bearbeitungstext nur lesbar zu machen. 

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

Android: inputType = "none"  

Android: textIsSelectable = "true"  

Android: focusable = "false"

Lass es versuchen :)

<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"/>
Android:editable

Wenn festgelegt, wird angegeben, dass dieses TextView eine Eingabemethode hat. Es wird eine textuelle sein, sofern nicht anders angegeben. Für TextView ist dies standardmäßig falsch. Für EditText ist dies standardmäßig true.

Muss ein boolean-Wert sein, entweder true oder false.

Dies kann auch eine Referenz auf eine Ressource (in der Form @[package:]type:name) oder ein Designattribut (in der Form ?[package:][type:]name) sein, die einen Wert dieses Typs enthält.

Dies entspricht dem bearbeitbaren globalen Attribut-Ressourcensymbol.

Verwandte Methoden

3
jclafuente

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;
    }
});
2
Jimmy Ilenloa

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, um ihn von einem normalen EditText abzugrenzen.

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 ist, dass der EditText als normaler EditText angezeigt wird, der Inhalt jedoch nicht geändert werden kann. Der Rückgabewert sollte als Variable erhalten bleiben, um vom schreibgeschützten Zustand in den normalen Zustand zurückkehren zu können. 

um einen EditText schreibgeschützt zu machen, setzen Sie ihn einfach wie folgt:

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

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

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

Dies hat für mich funktioniert und einige der oben genannten Vorschläge berücksichtigt. Macht das TextEdit fokussierbar, aber wenn der Benutzer klickt oder fokussiert, zeigen wir eine Auswahlliste in einem PopupWindow an. (Wir ersetzen das verrückte Spinner-Widget). TextEdit xml ist sehr generisch ... 

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);
    }
}  
1
Johnny O

Verwenden Sie diesen Code:

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

Durch das Deaktivieren von editText erhalten Sie ein schreibgeschütztes Aussehen und Verhalten. Die Textfarbe wird jedoch in Grau geändert, sodass die Textfarbe festgelegt werden muss. 

1
Mary Garcia

Wenn Sie nur Text aus dem Steuerelement kopieren möchten, ihn jedoch nicht bearbeiten können, möchten Sie möglicherweise ein TextView verwenden und text ist selectable.

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

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

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

1
A.J.Bauer

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

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

Legen Sie dies in der EdiTextView-XML-Datei fest

Android:focusable="false"
0

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

editTextPref.setSelectable(false);

Dies funktioniert gut, wenn Sie das Feld "Übersicht" verwenden, um schreibgeschützte Felder anzuzeigen (z. B. zur Anzeige von Kontoinformationen). Aktualisieren der Zusammenfassungsfelder dynamisch aus http://gmariotti.blogspot.com/2013/01/preferenceactivity-preferencefragment.html

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());
        }
    }
}
0
Jason Harmon