В макете вы можете установить виджет EditText
, который нельзя редактировать, используя android:editable attribute
.
Как это сделать в коде? Мне нужно сделать виджет EditText
доступным для редактирования в зависимости от условий.
В макете вы можете установить виджет 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. Это может быть null запретить ввод пользователя.
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)
или создать другой TextView
android:editable="false"
и используйте setVisiblilty()
для переключения между
редактируемые и не редактируемые виды. Если вы используете View.GONE
, пользователь будет
никогда не знаете, что есть два EditTexts.
Если вы чувствуете амбициозность, вы, вероятно, можете что-то сделать с прослушивателем EditText onTextChanged
, например, с тем, чтобы он реагировал с помощью setText
.
Вы пробовали setText (java.lang.CharSequence, android.widget.TextView.BufferType)? Он описывается как:
Устанавливает текст, отображаемый этим TextView (см. setText (CharSequence)), а также устанавливает, хранится ли он в буфере с возможностью стирания /spannable и доступен ли он для редактирования.
(акцент мой)
[Публикация нового ответа, так как я не могу прокомментировать ответ Йозефа.]
Входной фильтр работает нормально, но в нем есть тонкая ошибка: ввод текста по выделенному фрагменту удалит весь текст.
Например, скажем, у вас есть текст "foo"
в EditText
. Если вы выберете все (например, дважды щелкнув по нему) и введите 'a'
, текст исчезнет. Это связано с тем, что InputFilter
будет вызываться как:
filter("a", 0, 1, "foo", 0, 3);
Предлагаемый входной фильтр вернет пустую строку в этом случае (потому что src.length() < 1
- false
), что объясняет недостающий текст.
Решение состоит в том, чтобы просто вернуть dst.subSequence(dstart, dend)
в функцию фильтра. Это будет нормально работать даже для удаления.
Я хотел бы также указать альтернативное решение, которое прекрасно работает, если вы создаете новые экземпляры EditView. Вы можете переопределить метод getDefaultEditable(), предложенный документами для возврата false. Например.
EditText view = new EditText(DiscountCalculator.this) {
public boolean getDefaultEditable() {
return false;
}
};
Думаю,
Edittext.setEnabled(false);
через код
и
android:enabled="false"
через xml. Также проверьте этот пост на fooobar.com/questions/67515/....
Они должны работать, и вы можете снова включить программно Edittext.setEnabled(true);
Единственным решением, которое я нашел для этого сценария, является создание 2 макетов. Один из них доступен для редактирования, а другой нет. Возможно, вам придется создать более 2 макетов на основе различных условий. Сохраните условия в SharedPreferences или других средствах и загрузите соответствующий макет на основе условий после перезапуска Activity. Вот пример:
в 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();
}
Надеюсь, это поможет. Там действительно должно быть лучшее решение, но это то, что я делал. В идеале можно было бы сделать это на отдельных полях и не перезагружать активность/макеты. -bobby
Я думаю, что правильный способ достижения желаемого эффекта:
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;
}
}
}});