使EditText ReadOnly

时间:2011-06-17 09:44:54

标签: android android-edittext

我想制作只读EditText视图。执行此代码的XML似乎是android:editable="false",但我想在代码中执行此操作。

我该怎么做?

22 个答案:

答案 0 :(得分:121)

请使用此代码..

Edittext.setEnabled(false);

答案 1 :(得分:90)

如果您setEnabled(false),则editText看起来会被禁用(灰色等)。您可能不想更改编辑器的可视方面。

一种不太干扰的方法是使用setFocusable(false)

我相信这会更接近您的初步意图来回答您的问题。

答案 2 :(得分:27)

XML中使用:

android:editable="false"

举个例子:

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

答案 3 :(得分:20)

这对我有用:

EditText.setKeyListener(null);

答案 4 :(得分:14)

最好是使用TextView代替。

答案 5 :(得分:12)

editText.setInputType(InputType.TYPE_NULL);

根据docs,这可以防止显示软键盘。它还可以防止粘贴,允许滚动并且不会改变视图的视觉方面。但是,这也会阻止在视图中选择和复制文本。

从我的测试设置setInputTypeTYPE_NULL似乎在功能上等同于折旧的android:editable="false"。此外,android:inputType="none"似乎没有明显效果。

答案 6 :(得分: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字段上,然后应用此过滤器。

答案 7 :(得分:6)

android:editable =&#34; false&#34; 已弃用。因此,您无法使用它来使编辑文本只读。

我使用波纹管解决方案完成了这项工作。我在这里用过

android:inputType =&#34; none&#34;

android:textIsSelectable =&#34; true&#34;

<强>机器人:可聚焦=&#34;假&#34;

尝试尝试:)

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

答案 8 :(得分:5)

写下这两行对你的工作来说已经足够了。

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

答案 9 :(得分:5)

以XML格式设置

android:inputType="none" 

答案 10 :(得分:4)

尝试使用

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

答案 11 :(得分:3)

android:editable

如果设置,则指定此TextView具有输入方法。除非另有说明,否则它将是文本的。对于TextView,默认情况下为false。对于EditText,默认情况下为真。

必须是boolean值,truefalse

这也可能是对包含此类型值的资源(格式为@[package:]type:name)或主题属性(格式为?[package:][type:]name)的引用。

这对应于可编辑的全局属性资源符号。

相关方法

答案 12 :(得分:2)

尝试覆盖编辑文本的onLongClick侦听器以删除上下文菜单:

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

答案 13 :(得分:2)

使用此代码:

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

禁用editText会提供只读外观和行为,但也会将text-color更改为灰色,因此需要设置其文本颜色。

答案 14 :(得分:1)

这是我的实现(有点长,但对我有用!): 使用此代码,您可以将EditView设置为只读或正常。即使在只读状态下,文本也可以由用户复制。您可以更改背景,使其看起来与普通的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);

答案 15 :(得分:1)

这对我有用,考虑了上面的一些建议。使TextEdit可聚焦,但如果用户单击或聚焦,我们将在PopupWindow中显示选择列表。 (我们正在取代古怪的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);
    }
}  

答案 16 :(得分:1)

如果您只是希望能够从控件中复制文本但无法对其进行编辑,则可能需要使用 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,clickable和longClickable设置为相同的值...

但是我必须将focusable和focusableInTouchMode显式设置为true才能使其与触摸输入一起使用。

答案 17 :(得分:0)

不推荐使用android:editable=""

设置

  • android:clickable="false"
  • android:focusable="false"
  • android:inputType="none"
  • android:cursorVisible="false"

将其设置为“只读”。

但是,用户仍然可以粘贴到该字段中或执行任何其他长按动作。要禁用此功能,只需重写onLongClickListener()。
在科特林:

  • myEditText.setOnLongClickListener { true }

足够。

答案 18 :(得分:0)

我的解决方法是创建一个自定义TextWatcher类,如下所示:

class ReadOnlyTextWatcher implements TextWatcher {
    private final EditText textEdit;
    private String originalText;
    private boolean mustUndo = true;

    public ReadOnlyTextWatcher(EditText textEdit) {
        this.textEdit = textEdit;
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if (mustUndo) {
            originalText = charSequence.toString();
        }
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (mustUndo) {
            mustUndo = false;
            textEdit.setText(originalText);
        } else {
            mustUndo = true;
        }
    }
}

然后,您只需将该观察者添加到您希望即使已启用也只能读取的任何字段:

editText.addTextChangedListener(new ReadOnlyTextWatcher(editText));

答案 19 :(得分:0)

对我来说,这是唯一完整的简单解决方案。

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

答案 20 :(得分:0)

在EdiTextView xml文件中设置

android:focusable="false"

答案 21 :(得分:0)

使用:

将EditTextPreference设为只读是没有问题的
editTextPref.setSelectable(false);

当使用&#39;摘要&#39;字段显示只读字段(例如,用于显示帐户信息)。从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());
        }
    }
}