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?
Bitte verwenden Sie diesen Code.
Edittext.setEnabled(false);
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.
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"
/>
Das funktioniert für mich:
EditText.setKeyListener(null);
Am besten verwenden Sie stattdessen TextView
.
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.
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.
in XML gesetzt
Android:inputType="none"
das Schreiben dieser zwei Zeilen ist mehr als genug für Ihre Arbeit.
yourEditText.setKeyListener(null);
yourEditText.setEnabled(false);
Versuchen Sie es mit
editText.setEnabled(false);
editText.setClickable(false);
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
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;
}
});
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);
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);
}
}
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.
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.
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
Legen Sie dies in der EdiTextView-XML-Datei fest
Android:focusable="false"
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());
}
}
}