Сделать EditText Только Для Чтения


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

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

19 94

19 ответов:

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

Edittext.setEnabled(false);

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

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

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

в XML использовать

android:editable="false"

пример:

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

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

EditText.setKeyListener(null);

лучше всего с помощью .

editText.setInputType(InputType.TYPE_NULL);

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

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

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, а затем применить этот фильтр.

установить в XML

android:inputType="none" 

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

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

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

editText.setEnabled(false);
editText.setClickable(false);
android:editable

если установлено, указывает, что это TextView есть метод ввода. Он будет текстовым, если не указано иное. Ибо TextView, по умолчанию это значение равно false. Ибо EditText, Это правда по умолчанию.

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

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

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

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

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

Я сделал это с помощью приведенного ниже решения. Здесь я использовал

android:inputType= "none"

android: textIsSelectable= "true"

android: focusable= "false"

дать ему попробовать :)

<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"/>

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

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

Это моя реализация (немного длинная, но полезная для меня!): С помощью этого кода Вы можете сделать EditView доступным только для чтения или обычным. даже в состоянии только для чтения, текст может быть скопирован пользователем. вы можете изменить 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);

это сработало для меня, принимая во внимание несколько предложений выше. Делает TextEdit фокусируемым, но если пользователь нажимает или фокусируется, мы показываем список выборок во всплывающем окне. (Мы заменяем дурацкий виджет Spinner). 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);
    }
}  

Если вы просто хотите иметь возможность копировать текст из элемента управления, но не иметь возможности редактировать его, вы можете использовать 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, он устанавливает флаги focusable, focusableInTouchMode, кликабельны, и longClickable одно и то же значение...

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

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

editTextPref.setSelectable(false);

это хорошо работает в сочетании с использованием поля "сводка" для отображения полей только для чтения (полезно для отображения информации об учетной записи, например). Обновление полей сводки, динамически захваченных из 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());
        }
    }
}

установите это в xml-файле EdiTextView

android:focusable="false"

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

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

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