Я хочу сделать просмотр EditText
только для чтения. XML для этого кода выглядит как android:editable="false"
, но я хочу сделать это в коде.
Как я могу это сделать?
Я хочу сделать просмотр EditText
только для чтения. XML для этого кода выглядит как android:editable="false"
, но я хочу сделать это в коде.
Как я могу это сделать?
Пожалуйста, используйте этот код.
Edittext.setEnabled(false);
Если вы setEnabled(false)
, то ваш editText
будет выглядеть отключенным (серый и т.д.). Возможно, вы не захотите изменить визуальный аспект вашего редактора.
Менее интрузивным способом было бы использовать setFocusable(false)
.
Я считаю, что это отвечает на ваш вопрос ближе к вашему первоначальному намерению.
В XML
используйте:
android:editable="false"
В качестве примера:
<EditText
android:id="@+id/EditText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:editable="false" />
Это работает для меня:
EditText.setKeyListener(null);
Лучше всего использовать TextView
.
editText.setInputType(InputType.TYPE_NULL);
Согласно документам это предотвращает отображение программной клавиатуры. Это также предотвращает вставку, позволяет прокручивать и не изменяет визуальный аспект вида. Однако это также предотвращает выбор и копирование текста в представлении.
Из моих тестов установка setInputType
в TYPE_NULL
, по-видимому, функционально эквивалентна TYPE_NULL
android:editable="false"
. Кроме того, android:inputType="none"
похоже, не имеет заметного эффекта.
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) : "";
}
} });
Это даст вам необработанный фильтр EditText. сначала нужно поместить нужный текст в поле editText, а затем применить этот фильтр.
android: editable = "false" устарела. Поэтому вы не можете использовать его, чтобы редактировать текст только для чтения.
Я сделал это, используя приведенное ниже решение. Здесь я использовал
андроид: inputType = "нет"
андроид: textIsSelectable = "истина"
андроид: фокусируемый = "ложь"
Дай попробовать :)
<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"/>
Запись этой двух строк более чем достаточно для вашей работы.
yourEditText.setKeyListener(null);
yourEditText.setEnabled(false);
в XML
android:inputType="none"
Попробуйте использовать
editText.setEnabled(false);
editText.setClickable(false);
android:editable
Если установлено, указывает, что этот TextView
имеет метод ввода. Он будет текстовым, если не указано иное. Для TextView
это по умолчанию неверно. Для EditText
это по умолчанию истинно.
Значение boolean
должно быть true
или false
.
Это также может быть ссылка на ресурс (в форме @[package:]type:name
) или атрибут темы (в форме ?[package:][type:]name
), содержащий значение этого типа.
Это соответствует редактируемому символу ресурса глобального атрибута.
Связанные методы
Попробуйте переопределить прослушиватель onLongClick текста редактирования, чтобы удалить контекстное меню:
EditText myTextField = (EditText)findViewById(R.id.my_edit_text_id);
myTextField.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return true;
}
});
Используйте этот код:
editText.setEnabled(false);
editText.setTextColor(ContextCompat.getColor(context, R.color.black);
Отключение editText
дает внешний вид и поведение только для чтения, но также меняет text-color
на серый, поэтому необходимо установить его цвет текста.
это моя реализация (немного длинная, но полезная для меня!): С помощью этого кода вы можете сделать EditView только для чтения или Normal. даже в состоянии только для чтения, текст может быть скопирован пользователем. вы можете изменить backgroud, чтобы он выглядел иначе, чем обычный EditText.
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;
}
}
Преимущество этого кода в том, что EditText отображается как обычный EditText, но содержимое не может быть изменено. Возвращаемое значение должно храниться как переменная, чтобы можно было вернуться назад из состояния, доступного только для чтения, в нормальное состояние.
чтобы сделать EditText только для чтения, просто поставьте его как:
TextWatcher tw = setReadOnly(editText, true, null);
и сделать его нормальным использованием tw из предыдущего утверждения:
setReadOnly(editText, false, tw);
Это сработало для меня, учитывая некоторые из приведенных выше соображений. Делает TextEdit ориентируемым, но если пользователь нажимает или фокусируется, мы показываем список вариантов в PopupWindow. (Мы заменяем wacky Spinner widget). TextEdit xml очень общий...
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);
}
}
Если вы просто хотите копировать текст из элемента управления, но не можете его редактировать, вы можете использовать TextView и установить текст выбор.
код:
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"-->
Документация setTextIsSelectable гласит:
Когда вы вызываете этот метод для установки значения textIsSelectable, он устанавливает флаги с фокусом, focusableInTouchMode, clickable и longClickable с тем же значением...
Однако мне пришлось явно настроить focusable и focusableInTouchMode на true, чтобы он работал с сенсорным вводом.
У меня не было проблем с редактированием EditTextPreference только для чтения, используя:
editTextPref.setSelectable(false);
Это хорошо работает в сочетании с использованием поля "summary" для отображения полей только для чтения (полезно для отображения информации об учетной записи, например). Обновление итоговых полей, динамически вырванных из 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());
}
}
}
Задайте это в файле xml файла EdiTextView
android:focusable="false"
Это было единственное простое решение для меня.
editText.setEnabled(false); // Prevents data entry
editText.setFocusable(false); // Prevents being able to tab to it from keyboard