В макете вы можете установить EditText
виджет быть неизменяемыми через android:editable attribute
.
Как я могу это сделать в коде? Мне нужно сделать EditText
виджет редактируемой в зависимости от условий.
В макете вы можете установить EditText
виджет быть неизменяемыми через android:editable attribute
.
Как я могу это сделать в коде? Мне нужно сделать EditText
виджет редактируемой в зависимости от условий.
editText.setFocusable(false);
editText.setClickable(false);
это обеспечить EditText
контроль не может быть выбран и целенаправленный характер , поэтому он не может быть изменен.
Я просто попытался это сам,
Чтобы отключить редактирования текста:
.setFocusable(false);
это также устанавливает setFocusableInTouchMode ложь!
Чтобы включить для редактирования текста:
setFocusableInTouchMode(true);
это также устанавливает setFocusable истина;
Лучший способ сделать это с помощью этой одной строки кода:
textView.setKeyListener(null);
Документы говорят для этого метода:
Устанавливает ключ слушателя, который будет использоваться с этим TextView. Это может быть пустым, чтобы запретить ввод данных пользователя.
Я думаю, 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) : "";
}
}
});
Edit: dlazar предложил (ниже) , чтобы изменить return
для dst.subSequence(dstart, dend)
преодоления поведения, удаляющий слова.
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, отключить длительное нажатие, если вы не хотите пользователя открыть изменить параметры текста.
[Публикация нового ответа, так как я не могу прокомментировать ответ Иосифа.]
Входной фильтр работает нормально, но она имеет тонкую ошибку в нем: типирование по выбору удалит весь текст.
Например, у вас есть текст "foo"
в EditText
. Если вы выбираете все (например, с помощью двойного щелчка на нем) и типа 'a'
, текст исчезнет. Это происходит потому , что InputFilter
будет называться как:
filter("a", 0, 1, "foo", 0, 3);
Предлагаемый входной фильтр возвращает пустую строку в этом случае (потому что src.length() < 1
это false
), что объясняет недостающий текст.
Решение состоит в том, чтобы просто вернуться dst.subSequence(dstart, dend)
в функции фильтра. Это будет прекрасно работать даже для удалений.
Вы пробовали SetText (java.lang.CharSequence, android.widget.TextView.BufferType) ? Он описывается как:
Устанавливает текст , который этот TextView должен показать (см SetText (CharSequence)) , а также устанавливает ли она хранится в styleable / spannable буфера и будет ли он доступен для редактирования .
(Курсив мой)
Я не вижу способа , связанный для этого атрибута в классе EditText. Тем не менее, есть и другие подобные вещи , которые вы могли бы использовать , например , как
android:focus/setFocusable(boolean)
или создать другой TextView которого
android:editable="false"
и использовать setVisiblilty()
для переключения между редактируемым и не редактируемым видом. При использовании View.GONE
пользователь не будет знать , что есть два EditTexts.
Если ваше чувство амбициозными вы могли бы , вероятно , сделать что - то с EditText в onTextChanged
слушателе , как имеющее это реагировать с setText
.
Я полагаю
Edittext.setEnabled(false);
с помощью кода
а также
android:enabled="false"
через xml.Also проверить этот пост на SO .
Они должны работать, и вы можете снова включить программно Edittext.setEnabled(true);
Я хотел бы также отметить, альтернативное решение, которое работает хорошо, если вы создаете новые экземпляры в EditView. Вы можете переопределить метод getDefaultEditable (), как это было предложено документы вернуть ложь. Например
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();
}
Надеюсь это поможет. Там на самом деле должен быть лучшим решением, но это то, что я делал. В идеале, можно было бы быть в состоянии сделать это на отдельных полях и не перезагружать деятельности / макеты. -Бобби
попробуй это:
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;
}
}
}});
Я думаю, что правильный путь для достижения желаемого эффекта:
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);