Как реплицировать андроид: редактируемый = «ложный» в коде?

голоса
39

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

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

Задан 18/03/2009 в 22:19
источник пользователем
На других языках...                            


14 ответов

голоса
37
editText.setFocusable(false);
editText.setClickable(false);

это обеспечить EditTextконтроль не может быть выбран и целенаправленный характер , поэтому он не может быть изменен.

Ответил 03/12/2010 в 02:41
источник пользователем

голоса
24

Я просто попытался это сам,

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

.setFocusable(false);

это также устанавливает setFocusableInTouchMode ложь!

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

setFocusableInTouchMode(true);

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

Ответил 14/02/2012 в 11:56
источник пользователем

голоса
15

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

textView.setKeyListener(null);

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

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

Ответил 15/06/2011 в 01:58
источник пользователем

голоса
12

Я думаю, 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)преодоления поведения, удаляющий слова.

Ответил 26/05/2009 в 16:50
источник пользователем

голоса
6
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);
Ответил 12/04/2013 в 06:14
источник пользователем

голоса
4

Вы можете попробовать это:

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

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

Ответил 18/07/2013 в 13:36
источник пользователем

голоса
3

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

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

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

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

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

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

Ответил 21/01/2010 в 21:51
источник пользователем

голоса
3

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

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

(Курсив мой)

Ответил 19/03/2009 в 16:03
источник пользователем

голоса
3

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

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

Ответил 19/03/2009 в 01:43
источник пользователем

голоса
1

Я полагаю

Edittext.setEnabled(false); 

с помощью кода

а также

android:enabled="false"

через xml.Also проверить этот пост на SO .

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

Ответил 08/01/2016 в 11:17
источник пользователем

голоса
1

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

EditText view = new EditText(DiscountCalculator.this) {
    public boolean getDefaultEditable() {
        return false;
    }
};
Ответил 11/12/2011 в 00:08
источник пользователем

голоса
0

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

Надеюсь это поможет. Там на самом деле должен быть лучшим решением, но это то, что я делал. В идеале, можно было бы быть в состоянии сделать это на отдельных полях и не перезагружать деятельности / макеты. -Бобби

Ответил 31/05/2013 в 18:12
источник пользователем

голоса
-1

попробуй это:

 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;
            }
        }
    }});
Ответил 12/04/2017 в 13:57
источник пользователем

голоса
-1

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

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/12/2010 в 11:38
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more