Подтвердить что ты не робот

Как реплицировать android: editable = "false" в коде?

В макете вы можете установить виджет EditText, который нельзя редактировать, используя android:editable attribute.

Как это сделать в коде? Мне нужно сделать виджет EditText доступным для редактирования в зависимости от условий.

4b9b3361

Ответ 1

Я думаю, что 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), чтобы преодолеть поведение, которое удаляет слова.

Ответ 2

editText.setFocusable(false);
editText.setClickable(false);

это гарантирует, что элемент управления EditText не может быть выбран и сфокусирован, поэтому его нельзя отредактировать.

Ответ 3

Я просто попробовал это сам,

Чтобы отключить редактирование текста:

.setFocusable(false);

это также устанавливает для setFocusableInTouchMode значение false!

Чтобы включить редактирование текста:

setFocusableInTouchMode(true);

это также устанавливает setFocusable в true:

Ответ 4

Лучший способ сделать это - это одна строка кода:

textView.setKeyListener(null);

Документы говорят для этого метода:

Устанавливает прослушиватель клавиш, который будет использоваться с это TextView. Это может быть null запретить ввод пользователя.

Ответ 5

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);

Ответ 6

Вы можете попробовать следующее:

        mEditText.setFocusable(false);
        mEditText.setClickable(false);
        mEditText.setFocusableInTouchMode(false);
        mEditText.setLongClickable(false);
        mEditText.setInputType(InputType.TYPE_NULL);

Это полностью отключит EditText, отключите длительное нажатие, если вы не хотите, чтобы пользователь открывал параметры редактирования текста.

Ответ 7

Я не вижу связанного метода для этого атрибута в EditText класс. Однако есть и другие подобные вещи, которые вы могли бы использовать, например android:focus/setFocusable(boolean) или создать другой TextView android:editable="false" и используйте setVisiblilty() для переключения между редактируемые и не редактируемые виды. Если вы используете View.GONE, пользователь будет никогда не знаете, что есть два EditTexts.

Если вы чувствуете амбициозность, вы, вероятно, можете что-то сделать с прослушивателем EditText onTextChanged, например, с тем, чтобы он реагировал с помощью setText.

Ответ 8

Вы пробовали setText (java.lang.CharSequence, android.widget.TextView.BufferType)? Он описывается как:

Устанавливает текст, отображаемый этим TextView (см. setText (CharSequence)), а также устанавливает, хранится ли он в буфере с возможностью стирания /spannable и доступен ли он для редактирования.

(акцент мой)

Ответ 9

[Публикация нового ответа, так как я не могу прокомментировать ответ Йозефа.]

Входной фильтр работает нормально, но в нем есть тонкая ошибка: ввод текста по выделенному фрагменту удалит весь текст.

Например, скажем, у вас есть текст "foo" в EditText. Если вы выберете все (например, дважды щелкнув по нему) и введите 'a', текст исчезнет. Это связано с тем, что InputFilter будет вызываться как:

filter("a", 0, 1, "foo", 0, 3);

Предлагаемый входной фильтр вернет пустую строку в этом случае (потому что src.length() < 1 - false), что объясняет недостающий текст.

Решение состоит в том, чтобы просто вернуть dst.subSequence(dstart, dend) в функцию фильтра. Это будет нормально работать даже для удаления.

Ответ 10

Я хотел бы также указать альтернативное решение, которое прекрасно работает, если вы создаете новые экземпляры EditView. Вы можете переопределить метод getDefaultEditable(), предложенный документами для возврата false. Например.

EditText view = new EditText(DiscountCalculator.this) {
    public boolean getDefaultEditable() {
        return false;
    }
};

Ответ 11

Думаю,

Edittext.setEnabled(false); 

через код

и

android:enabled="false"

через xml. Также проверьте этот пост на fooobar.com/questions/67515/....

Они должны работать, и вы можете снова включить программно Edittext.setEnabled(true);

Ответ 12

Единственным решением, которое я нашел для этого сценария, является создание 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

Ответ 13

Я думаю, что правильный способ достижения желаемого эффекта:

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);

Ответ 14

попробуйте следующее:

 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;
            }
        }
    }});