Сделать EditText ReadOnly

Я хочу сделать просмотр EditText только для чтения. XML для этого кода выглядит как android:editable="false", но я хочу сделать это в коде.

Как я могу это сделать?

Ответ 1

Пожалуйста, используйте этот код.

Edittext.setEnabled(false);

Ответ 2

Если вы setEnabled(false), то ваш editText будет выглядеть отключенным (серый и т.д.). Возможно, вы не захотите изменить визуальный аспект вашего редактора.

Менее интрузивным способом было бы использовать setFocusable(false).

Я считаю, что это отвечает на ваш вопрос ближе к вашему первоначальному намерению.

Ответ 3

В XML используйте:

android:editable="false"

В качестве примера:

<EditText
    android:id="@+id/EditText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:editable="false" />

Ответ 4

Это работает для меня:

EditText.setKeyListener(null);

Ответ 5

Лучше всего использовать TextView.

Ответ 6

editText.setInputType(InputType.TYPE_NULL);

Согласно документам это предотвращает отображение программной клавиатуры. Это также предотвращает вставку, позволяет прокручивать и не изменяет визуальный аспект вида. Однако это также предотвращает выбор и копирование текста в представлении.

Из моих тестов установка setInputType в TYPE_NULL, по-видимому, функционально эквивалентна TYPE_NULL android:editable="false". Кроме того, android:inputType="none" похоже, не имеет заметного эффекта.

Ответ 7

editText.setEnabled(false);
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) : "";
    }
} });

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

Ответ 8

android: editable = "false" устарела. Поэтому вы не можете использовать его, чтобы редактировать текст только для чтения.

Я сделал это, используя приведенное ниже решение. Здесь я использовал

андроид: inputType = "нет"

андроид: textIsSelectable = "истина"

андроид: фокусируемый = "ложь"

Дай попробовать :)

<EditText
         android:id="@+id/et_newsgpa_university"
         android:layout_height="wrap_content"
         android:layout_width="match_parent"
         android:hint="@string/hint_educational_institute"
         android:textSize="@dimen/regular_text"
         android:inputType="none"
         android:textIsSelectable="true"
         android:focusable="false"
         android:maxLines="1"
         android:imeOptions="actionNext"/>

Ответ 9

Запись этой двух строк более чем достаточно для вашей работы.

yourEditText.setKeyListener(null); 
yourEditText.setEnabled(false);

Ответ 10

в XML

android:inputType="none" 

Ответ 11

Попробуйте использовать

editText.setEnabled(false);
editText.setClickable(false);

Ответ 12

android:editable

Если установлено, указывает, что этот TextView имеет метод ввода. Он будет текстовым, если не указано иное. Для TextView это по умолчанию неверно. Для EditText это по умолчанию истинно.

Значение boolean должно быть true или false.

Это также может быть ссылка на ресурс (в форме @[package:]type:name) или атрибут темы (в форме ?[package:][type:]name), содержащий значение этого типа.

Это соответствует редактируемому символу ресурса глобального атрибута.

Связанные методы

Ответ 13

Попробуйте переопределить прослушиватель onLongClick текста редактирования, чтобы удалить контекстное меню:

EditText myTextField = (EditText)findViewById(R.id.my_edit_text_id);
myTextField.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        return true;
    }
});

Ответ 14

Используйте этот код:

editText.setEnabled(false);
editText.setTextColor(ContextCompat.getColor(context, R.color.black);

Отключение editText дает внешний вид и поведение только для чтения, но также меняет text-color на серый, поэтому необходимо установить его цвет текста.

Ответ 15

это моя реализация (немного длинная, но полезная для меня!): С помощью этого кода вы можете сделать EditView только для чтения или Normal. даже в состоянии только для чтения, текст может быть скопирован пользователем. вы можете изменить backgroud, чтобы он выглядел иначе, чем обычный EditText.

public static TextWatcher setReadOnly(final EditText edt, final boolean readOnlyState, TextWatcher remove) {
    edt.setCursorVisible(!readOnlyState);
    TextWatcher tw = null;
    final String text = edt.getText().toString();
    if (readOnlyState) {
            tw = new TextWatcher();

            @Override
            public void afterTextChanged(Editable s) {

            }
            @Override
            //saving the text before change
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            // and replace it with content if it is about to change
            public void onTextChanged(CharSequence s, int start,int before, int count) {
                edt.removeTextChangedListener(this);
                edt.setText(text);
                edt.addTextChangedListener(this);
            }
        };
        edt.addTextChangedListener(tw);
        return tw;
    } else {
        edt.removeTextChangedListener(remove);
        return remove;
    }
}

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

чтобы сделать EditText только для чтения, просто поставьте его как:

TextWatcher tw = setReadOnly(editText, true, null);

и сделать его нормальным использованием tw из предыдущего утверждения:

setReadOnly(editText, false, tw);

Ответ 16

Это сработало для меня, учитывая некоторые из приведенных выше соображений. Делает TextEdit ориентируемым, но если пользователь нажимает или фокусируется, мы показываем список вариантов в PopupWindow. (Мы заменяем wacky Spinner widget). TextEdit xml очень общий...

public void onCreate(Bundle savedInstanceState) {
    ....  
    fEditState = (EditText) findViewById(R.id.state_edit);

    fEditState.setLongClickable(false);
    fEditState.setKeyListener(null);
    fEditState.setFocusable(true);

    fEditState.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus)
        {
            if (hasFocus)
            {
               showStatesPopup();

            }
        }
    });

    fEditState.setOnClickListener(new Button.OnClickListener(){

        public void onClick(View arg0)
        {
           showStatesPopup();
        }
    });
    ....
}

private void showStatesPopup()
{
    // fPopupWindowStates instantiated in OnCreate()

    if (!fPopupWindowStates.isShowing()) {
        // show the list view as dropdown
        fPopupWindowStates.showAsDropDown(fEditState, -5, 0);
    }
}  

Ответ 17

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

код:

myTextView.setTextIsSelectable(true);
myTextView.setFocusable(true);
myTextView.setFocusableInTouchMode(true);
// myTextView.setSelectAllOnFocus(true);

XML:

<TextView
    android:textIsSelectable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"     
    ...
/>
<!--android:selectAllOnFocus="true"-->


Документация setTextIsSelectable гласит:

Когда вы вызываете этот метод для установки значения textIsSelectable, он устанавливает флаги с фокусом, focusableInTouchMode, clickable и longClickable с тем же значением...

Однако мне пришлось явно настроить focusable и focusableInTouchMode на true, чтобы он работал с сенсорным вводом.

Ответ 18

У меня не было проблем с редактированием EditTextPreference только для чтения, используя:

editTextPref.setSelectable(false);

Это хорошо работает в сочетании с использованием поля "summary" для отображения полей только для чтения (полезно для отображения информации об учетной записи, например). Обновление итоговых полей, динамически вырванных из http://gmariotti.blogspot.com/2013/01/preferenceactivity-preferencefragment.html

private static final List<String> keyList;

static {
    keyList = new ArrayList<String>();
    keyList.add("field1");
    keyList.add("field2");
    keyList.add("field3");
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);

    for(int i=0;i<getPreferenceScreen().getPreferenceCount();i++){
        initSummary(getPreferenceScreen().getPreference(i));
    }
}

private void initSummary(Preference p) {
    if (p instanceof PreferenceCategory) {
        PreferenceCategory pCat = (PreferenceCategory) p;
        for (int i = 0; i < pCat.getPreferenceCount(); i++) {
            initSummary(pCat.getPreference(i));
        }
    } else {
        updatePrefSummary(p);
    }
}

private void updatePrefSummary(Preference p) {
    if (p instanceof ListPreference) {
        ListPreference listPref = (ListPreference) p;
        p.setSummary(listPref.getEntry());
    }
    if (p instanceof EditTextPreference) {
        EditTextPreference editTextPref = (EditTextPreference) p;
        //editTextPref.setEnabled(false); // this can be used to 'gray out' as well
        editTextPref.setSelectable(false);
        if (keyList.contains(p.getKey())) {
            p.setSummary(editTextPref.getText());
        }
    }
}

Ответ 19

Задайте это в файле xml файла EdiTextView

android:focusable="false"

Ответ 20

Это было единственное простое решение для меня.

editText.setEnabled(false);   // Prevents data entry
editText.setFocusable(false); // Prevents being able to tab to it from keyboard