如何使EditText在Android中无法通过XML编辑?


300

谁能告诉我如何EditText通过XML 进行不可编辑?我尝试设置android:editablefalse,但

  1. 不推荐使用;和
  2. 它没有用。

6
如果不可编辑,为什么需要EditText?使用普通的TextView就足够了吗?并且不建议使用setEditable()函数吗?
kiki 2010年

4
对我而言,这是有意义的,以便为内容启用标准复制粘贴。使用TextView是不可能的(至少不是默认行为)
Ixx 2012年

1
更正:这是一个坏主意。在某些情况下,视图将变为可编辑状态,或者复制粘贴选项不再显示。会寻找其他方法。
Ixx

11
就我而言,我想在执行一组操作时暂时禁用EditText,然后在操作完成后重新启用它。
Joe Plante 2012年

1
这个问题是关于合理的关注。为了保持EditText风格和许可滚动,利用UI.setReadOnly(myEditText, true)这个库。必须设置一些属性,您可以在源代码中检出。
Caw

Answers:


399

使用以下简单代码:

textView.setKeyListener(null);

有用。

编辑:要KeyListener稍后添加,请执行以下操作

1:将关键侦听器设置为的标签 textView

textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);

2:从标签获取关键侦听器并将其设置回 textView

textView.setKeyListener((KeyListener) textView.getTag());

30
@AnkitAwasthi textView.setTag(textView.getKeyListener()); 稍后将其设置为textView.setKeyListener((KeyListener)textView.getTag());
Thomas Dignan 2012年

@TomDignan很容易做到这一点!我有一个问题。是否以任何方式更改KeyListener所需的默认值,例如,setFocusable()因为文档说如果更改默认实现,则可能会更改默认值。
安迪2012年

afaik不,该标签应该可供您使用
Thomas Dignan 2012年

嘿乌尔建议帮助me..thanx
user1387035

38
问题是关于通过XML进行设置,为什么将其标记为解决方案?
Denys Vitali

398

将此添加到您的EditText xml文件中:

<EditText ...
        android:clickable="false" 
        android:cursorVisible="false" 
        android:focusable="false" 
        android:focusableInTouchMode="false">
</EditText>

效果与相同android:editable="false"。为我工作,希望它也对您有用。


3
notes.setKeyListener(null); notes.setClickable(false); notes.setCursorVisible(false); notes.setFocusable(false); notes.setFocusableInTouchMode(false);
杰克·弗兰岑

3
如果要在XML中执行此操作,它将与TextView有什么区别???
克里斯·辛

11
区别在于,它可以与TextInputLayout
ahmadalibaloch

2
应该将其标记为解决方案,因为它是问题中要求的纯XML解决方案。
zgc7009 '11

2
已弃用(2018年10月)
Sebastian Paduano,

54

让您的Edittext为

EditText editText;

editText.setKeyListener(null);

可以工作,但只是不听键。

用户可以在编辑文本上看到光标。

你可以试试 editText.setEnabled(false);

这意味着用户看不到光标。简单地说,它将成为TextView


3
这是正确的,因为EditText是TextView的子类。但是,请使用editText作为变量而不是textView。
Joe Plante 2012年

@JoePlante更改了变量名,谢谢您的建设性评论。
Mahendran 2012年

这使EditText变灰
斯蒂芬

灰色EditText表示其已被禁用,用户无法对其进行编辑。
Mahendran

设置颜色以及将防止出现灰色外观。XML:尝试android:textColor =“ @ color / Black” android:enabled =“ false”
红酒,

32

如其他答案中所述,您可以执行以下操作,setEnabled(false) 但是由于您正在询问如何通过XML进行设置,因此请执行以下操作。

将以下属性添加到您的EditText

android:enabled="false"

4
运营问题的确切答案。
SMR 2015年

但此方法已弃用
Lalit kumar

2
@Lalitkumar enabled不被弃用。editable是。
InsanityOnAB18年

7
通过启用,我们也无法访问点击监听器。所以对我来说,这不是答案。
Naveed Ahmad

这是隐藏的文本:(
Chego

24

从XML禁用(一行):

 android:focusable="false"

从Java重新启用(如果需要)(也是一行):

editText.setFocusableInTouchMode(true);

好答案。这样,您仍然可以使用editText.setText(“ your text”)设置editText值。但是用户无法编辑它。
Prakash

17

他们弃用了“可编辑”功能,但没有在inputType中提供相应的工作方式。

顺便说一句,inputType =“ none”有什么作用吗?就我所知,是否使用它没有任何区别。

例如,默认的editText被称为单行。但是您必须选择一个inputType使其为单行。而且,如果您选择“无”,它仍然是多行。


1
它不会使一个区别的所有设备,但它应该:根据文档developer.android.com/reference/android/widget/...
CAW

12
Google混乱的一个美丽示例
Yar 2015年

14

这种组合对我有用:

<EditText ... >
    android:longClickable="false"
    android:cursorVisible="false"
    android:focusableInTouchMode="false"
</EditText>

13

如您所述,不推荐使用android:editable。应该改用android:inputType =“ none”,但由于存在错误(https://code.google.com/p/android/issues/detail?id=2854),它无法正常工作

但是您可以通过使用focusable实现相同的目的。

通过XML:

<EditText ...
        android:focusable="false" 
</EditText>

来自代码:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);

由google提供,该错误将分为两种不同的情况:1.)将被修复,但是6年后2.)将永远不会被修复,他们只会开发新版本的Android。
霓虹灯Warge '16

12

如果要单击它,但不想编辑它,请尝试:

        android:focusable="false"


7
<EditText
    android:id="@+id/txtDate"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="2dp"
    android:clickable="false"
    android:cursorVisible="false"
    android:gravity="center" />

并使用以下内容:

txtDate.setKeyListener(null);

7

如果要在Java代码中执行此操作,请使用此行将其禁用:

editText.setEnabled(false);

并启用它:

editText.setEnabled(true);

5

我试着做:

textView.setInputType( InputType.TYPE_NULL );

哪个应该工作,但对我来说却没有。

我完成了以下代码:

textView.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

    protected char[] getAcceptedChars() {
        return new char[] {};
    }
});

完美地运作。


4

当我希望某个活动不专注于EditText并且在单击时也不显示键盘时,这对我有用。

向主布局添加属性

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

然后是EditText字段

android:focusable="false"
android:focusableInTouchMode="false"

这是一个例子:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_home"
    android:background="@drawable/bg_landing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    tools:context="com.woppi.woppi.samplelapp.HomeActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/fromEditText"
        android:layout_weight="1"
        android:hint="@string/placeholder_choose_language"
        android:textColor="@android:color/white"
        android:textColorHint="@android:color/darker_gray"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:onClick="onSelectFromLanguage" />

</RelativeLayout>

3

除了@mahe madi,您也可以尝试

editText.setEnabled(false);
editor.setTextColor(Color.BLACK);

此方法将隐藏光标,失去焦点,更重要的是像TextView一样将文本颜色设置为黑色。

并返回到editText只需执行此操作即可获得EditText的所有属性。

editText.setEnabled(true);

希望能帮助到你 :)


3

您可以使用,android:editable="false"但我真的建议您使用,setEnabled(false)因为它为用户提供了视觉提示,表明无法进行编辑。所有禁用的小部件都使用相同的视觉提示,并且一致性良好。


3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

“ longClickable”属性禁用导致“粘贴”和/或“全选”选项显示为工具提示的长按操作。


2

我尝试了以下方法:

codeEditText.setInputType(InputType.TYPE_NULL);

this.codeEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

  @Override
  public void onFocusChange(View v, boolean hasFocus) {

    if (hasFocus) {

      pickCode();

    }

  }

});
this.codeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickCode();

  }

});

但是问题在于,如果编辑文本是表单中的第一个文本,那么它将获得焦点,并且立即调用启动新活动的pickCode()代码。因此,我修改了代码,如下所示,它似乎工作得很好(除非我不能将重点放在文本编辑上,但是我不需要这样做):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

最好的祝福,

欢迎发表评论,

约翰·高奇


1
似乎工作正常,但使用看起来像EditText的TextView难道不是一件容易的事(使用:style =“ @ android:style / Widget.EditText”)吗?
android开发人员

2

EditText.setFocusable(false)如果要编辑,请使用并再次设置true。



2

这样可以为我完成工作,我可以选择并复制到剪贴板,但不能修改或粘贴。

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"

1

android:editable已过时,请改用inputType

   <EditText
        android:id="@+id/editText_x"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="70"
        android:inputType="none"
        android:hint="@string/enter_x" />

android:inputType =“ none”与android:editable有很大不同,请自己尝试!
Denys Vitali

如果您要使EditText不可编辑,我建议使用TextView小部件而不是EditText,因为在这种情况下,使用EditText似乎毫无意义。
拉扎维

您的建议不适用于带有PopupWindow的EditText,请参见此图像以更好地理解问题。在此示例中,我确实希望具有EditText的外观,但必须“锁定它”,以便用户仅通过popupwindow即可更改值。检查此问题以查看更多动机。自2009年以来就存在这个问题。
。– Denys Vitali

1

我遇到了同样的问题,但是经过观察,我发现android:editable="false"只有在Edittext android:inputType="ANY_VALUE"提供inputtype()时,该方法才有效。

从EditText移除inputType并使用editable = false,它可以正常工作。


0

我用一个对话框解决这个问题。

    AlertDialog dialog;
    EditText _editID;
    TextView _txtID;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        _txtID = (TextView) findViewById(R.id._txtID);
        dialog = new AlertDialog.Builder(this).create();
        _editID = new EditText(this);
        _editID.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
        dialog.setTitle("Numero do Registro:");
        dialog.setView(_editID);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "IR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                _txtID.setText(_editID.getText());
                toId(Integer.parseInt((_editID.getText().toString())));
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCELAR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        _txtID.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _txtID.setText("_editID.getText()");
                //_editID.setText("");
                dialog.show();

            }
        });



-10

试试这个代码。它正在我的项目中工作,因此它将在您的项目中工作。

android:editable="false"

2
我可以确认这行不通,而且不建议您使用折旧方法。
Adorjan Princz

1
如果您希望字段可单击但不可编辑,则android:editable实际上是最佳的解决方案,即在单击后打开对话框。
Yar 2015年

不是因为它可以在您的项目上运行,而会在我们的项目上运行。思维很差。
霓虹灯Warge '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.