Как воспроизвести Android: edable = «false» в коде?
-
20-08-2019 - |
Вопрос
В макете вы можете установить EditText
виджет не подходит через android:editable attribute
.
Как я могу сделать это в коде? Мне нужно сделать EditText
виджет, чтобы быть редактируемым в зависимости от условий.
Решение
Я думаю InputFilter
что отвергает все изменения - хорошее решение:
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) : "";
}
}
});
Редактировать: dlazar предложил (ниже) изменить return
к dst.subSequence(dstart, dend)
преодолеть поведение, которое удаляет слова.
Другие советы
editText.setFocusable(false);
editText.setClickable(false);
это обеспечивает EditText
Контроль не может быть выбран и сфокусирован, поэтому его нельзя отредактировать.
Я только что попробовал это сам,
Чтобы отключить текст редактирования:
.setFocusable(false);
Это также устанавливает SetFocusableIntouchMode на false!
Чтобы включить текст редактирования:
setFocusableInTouchMode(true);
Это также устанавливает SETFOCUSABLE на TRUE;
Лучший способ сделать это с этой единственной строкой кода:
textView.setKeyListener(null);
Документы говорят для этого метода:
Устанавливает ключевой слушатель, который будет использоваться с этим TextView. Это может быть нулевым, чтобы запретить пользовательский ввод.
android:editable="false"
android:inputType="none"
в вашем XML или
EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setEnabled(false);
или же
EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setKeyListener(null);
Вы можете попробовать это:
mEditText.setFocusable(false);
mEditText.setClickable(false);
mEditText.setFocusableInTouchMode(false);
mEditText.setLongClickable(false);
mEditText.setInputType(InputType.TYPE_NULL);
Это полностью отключит EditText, отключите длинное нажмите, если вы не хотите, чтобы пользователь открывал параметры текста редактирования.
Я не вижу связанного метода для этого атрибута в классе EditText. Однако есть и другие подобные вещи, которые вы могли бы использовать, например, какandroid:focus/setFocusable(boolean)
или создать еще один текстandroid:editable="false"
и использовать setVisiblilty()
переключаться между редактируемыми, а не редактируемыми видами. Если вы используете View.GONE
Пользователь никогда не узнает, что есть два Edittexts.
Если вы чувствуете амбициозное, вы, вероятно, что -то сделать с EditText onTextChanged
слушатель нравится, когда он реагирует с setText
.
Размещение нового ответа, так как я не могу комментировать ответ Йозефа.
Входной фильтр работает нормально, но в нем есть тонкая ошибка: ввод на выбор удалит весь текст.
Например, скажем, у вас есть текст "foo"
в EditText
. Анкет Если вы выберете все это (например, дважды щелкнув по нему) и введите 'a'
, текст исчезнет. Это потому, что InputFilter
будет называться как:
filter("a", 0, 1, "foo", 0, 3);
Предложенный входной фильтр вернет пустую строку в этом случае (потому что src.length() < 1
является false
), что объясняет недостающий текст.
Решение состоит в том, чтобы просто вернуться dst.subSequence(dstart, dend)
в функции фильтра. Это будет работать нормально даже для делеций.
Ты пытался setText (java.lang.chareSequence, android.widget.textview.buffertype) ? Это описано как:
Устанавливает текст, который этот TextView для отображения (см. SetText (chareSectence)), а также устанавливает, хранится ли он в стиле/проданном буфере и является ли он редактированием.
(акцент мой)
Наверное
Edittext.setEnabled(false);
через код
а также
android:enabled="false"
Через XML.Als Проверьте этот пост на ТАК.
Они должны работать, и вы можете снова включить программатически программа Edittext.setEnabled(true);
Я также хотел указать на альтернативное решение, которое работает хорошо, если вы создаете новые экземпляры EditView. Вы можете переопределить метод getDefateditable (), как предложено документами, чтобы вернуть False. Например
EditText view = new EditText(DiscountCalculator.this) {
public boolean getDefaultEditable() {
return false;
}
};
Единственное решение, которое я нашел для этого сценария, - это создать 2 макета. Один из них редактируется, а один - нет. Возможно, вам придется создать более 2 макетов на основе различных условий. Храните условия в SharedPreferences или других средствах и загрузите соответствующий макет на основе условий после перезапуска деятельности. Вот пример:
В Oncreate () деятельности:
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);
}
Задание можно перезапустить на основе тестирования на условия и вызова функций как:
private void setManualEditing(){
configuration.set_isManualSettingsMode(true);
this.recreate();
}
private void setAutoEditing(){
configuration.set_isManualSettingsMode(false);
this.recreate();
}
Надеюсь это поможет. На самом деле должно быть лучшее решение, но это то, что я делал. В идеале можно было бы сделать это на отдельных областях и не нужно перезагрузить деятельность / макеты. -Бобби
Я думаю, что правильный способ достижения желаемого эффекта:
mEditView.setText("my text", BufferType.NORMAL);
Если вы хотите переключиться между редактируемым и невозможным, вы можете сделать следующее:
// Switch to non-editable
mEditView.setText(mEditView.getText(), BufferType.NORMAL);
// Switch back to editable
mEditView.setText(mEditView.getText(), BufferType.EDITABLE);
попробуй это:
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;
}
}
}});