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

时间:2010-10-13 22:52:54

标签: android android-edittext

有谁能告诉我如何通过XML使EditText无法编辑?我尝试将android:editable设置为false,但

  1. 它已被弃用;和
  2. 它不起作用。

29 个答案:

答案 0 :(得分:385)

使用这个简单的代码:

textView.setKeyListener(null);

有效。

修改:要稍后添加KeyListener,请执行以下操作

1:将关键监听器设置为textView

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

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

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

答案 1 :(得分:374)

将其添加到EditText xml文件中:

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

它将与android:editable="false"具有相同的效果。为我工作,希望它也适合你。

答案 2 :(得分:54)

让你的Edittext

EditText editText;

editText.setKeyListener(null);

会起作用,但它只是不听钥匙。

用户可以在edittext上看到光标。

您可以尝试editText.setEnabled(false);

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

答案 3 :(得分:26)

正如其他答案中所提到的,你可以做一个setEnabled(false)但是因为你问的是如何通过XML设置它,这里是如何做到的。

将以下属性添加到EditText

android:enabled="false"

答案 4 :(得分:24)

禁用XML(一行):

 android:focusable="false"

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

editText.setFocusableInTouchMode(true);

答案 5 :(得分:15)

他们不推荐使用“editable”,但没有在inputType中提供相应的工作。

顺便问一下,inputType =“none”有效吗?在我看来,使用或不使用它并没有任何区别。

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

答案 6 :(得分:13)

正如你提到的android:editable已被弃用。应该使用android:inputType =“none”,但由于bug(https://code.google.com/p/android/issues/detail?id=2854

它不起作用

但是你可以通过使用focusable来实现同样的目标。

通过XML:

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

来自代码:

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

答案 7 :(得分:12)

如果您想点击它,但又不想编辑它,请尝试:

        android:focusable="false"

答案 8 :(得分:11)

这种组合对我有用:

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

答案 9 :(得分: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);

答案 10 :(得分:6)

只需使用EditText即可。这也会使 Base& add(Base &other) { n += other.n; return *this; } 显示出来,使其看起来不可编辑。

答案 11 :(得分:6)

如果你想在java代码中执行它,只需使用此行禁用它:

editText.setEnabled(false);

这是为了启用它:

editText.setEnabled(true);

答案 12 :(得分:5)

我试着这样做:

textView.setInputType( InputType.TYPE_NULL );

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

我完成了这段代码:

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

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

完美无缺。

答案 13 :(得分:3)

你可以使用android:editable="false"但我真的会建议你 使用setEnabled(false),因为它为用户提供了一个视觉线索 控件无法编辑。所有人都使用相同的视觉提示 禁用小部件和一致性很好。

答案 14 :(得分:3)

当我希望活动不关注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>

答案 15 :(得分:2)

这样做了我的工作,我可以选择并复制到剪贴板,但我无法修改或粘贴。

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

答案 16 :(得分:2)

android:focusable="false"

android:clickable="false"

android:longClickable="false"

“ longClickable”属性禁用长按动作,这些动作会导致“粘贴”和/或“全选”选项显示为工具提示。

答案 17 :(得分:2)

如果我想编辑,我会使用EditText.setFocusable(false)并再次设置为true。

答案 18 :(得分:2)

试试这个:

android:inputType="none"

答案 19 :(得分:2)

除了@mahe madi 你也可以试试这个

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

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

要恢复返回editText,只需执行此操作即可获得EditText的所有属性。

editText.setEnabled(true);

希望它有助于:)

答案 20 :(得分: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();

  }

});

最诚挚的问候,

欢迎评论,

John Goche

答案 21 :(得分: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" />

答案 22 :(得分:1)

我遇到了同样的问题,但经过观察后我发现android:editable="false"仅在编辑文本中给出inputtype(android:inputType="ANY_VALUE"时才有效。

从EditText中删除inputType并使用editable = false,其工作正常。

答案 23 :(得分:1)

请试试这个!,它可能会帮助一些人

stop

答案 24 :(得分: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();

            }
        });

答案 25 :(得分:0)

简短答案: 我使用了android:focusable="false",它起作用了。点击监听功能现在也可以使用。

答案 26 :(得分:0)

Kotlin 扩展选项:

fun AppCompatAutoCompleteTextView.setEditable(editable: Boolean) {
    if (!editable) {
        this.tag = this.keyListener
        this.keyListener = null
    } else {
        if(this.tag is KeyListener) {
            this@setEditable.keyListener = this@setEditable.tag as KeyListener
        }
    }
}

答案 27 :(得分:-1)

尝试

{ 
    "version": "0.1.0",
    "command": "${workspaceRoot}/run_tasks.bat",
    "isShellCommand": true,
    "isWatching": true,
    "showOutput": "always",

    "args": [],

    "tasks": [
        {
            "taskName": "build",
            "isBuildCommand": true,
            "isWatching": true,
            "showOutput": "always"
        }
}

答案 28 :(得分:-10)

试试这段代码。它在我的项目中工作,因此它可以在你的项目中工作。

android:editable="false"