Вопрос

В макете вы можете установить 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;
            }
        }
    }});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top