如何使EditText不可编辑通过XML在Android?

谁能告诉我如何使一个EditText不可编辑通过XML?我尝试将android:editable设置为false,但是

  1. 已弃用;而且
  2. 但是没有成功。
304531 次浏览

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

顺便说一下,inputType="none"有什么影响吗?在我看来,用不用它没有任何区别。

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

我试着这样做:

textView.setInputType( InputType.TYPE_NULL );

这应该有用,但对我来说没用。

我完成了下面的代码:

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


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

这很完美。

使用这段简单的代码:

textView.setKeyListener(null);

它的工作原理。

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

1:设置键监听器为textView标签

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

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

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

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

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

它的效果与android:editable="false"相同。对我有用,希望对你也有用。

让你的编辑文本

EditText editText;

editText.setKeyListener(null);

会起作用,但就是听不到按键。

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

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

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

我试过以下几种方法:

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()代码,用于启动一个新活动 直接调用。所以我修改代码如下,它似乎 工作得很好(除了我不能将焦点设置在文本编辑上,但是 I don't need to):

itemCodeEditText.setFocusable(false);


this.itemCodeEditText.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {


pickItem();


}


});

最好的问候,

我们欢迎评论,

约翰Goche

<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);

试试这段代码。它在我的项目中工作,所以它将在你的项目中工作。

android:editable="false"

正如你提到的,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);

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

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

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

要恢复回editText,只需这样做即可获得editText的所有属性。

editText.setEnabled(true);

希望能有所帮助。

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

如果你想在java代码中这样做,只需使用这一行来禁用它:

editText.setEnabled(false);

这是为了启用它:

editText.setEnabled(true);

disable from XML(一行):

 android:focusable="false"

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

editText.setFocusableInTouchMode(true);

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

EditText中添加以下属性:

android:enabled="false"

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

android:可编辑已弃用,所以改用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"

试一试

.setInputType(InputType.TYPE_NULL);

如果你想点击它,但不想编辑它,试试:

        android:focusable="false"

只需使用android:enabled="false"即可。这也会给EditText一个外观,使它看起来不可编辑。

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

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

当我想要一个活动不关注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>

我也遇到过同样的问题,但经过观察,我发现android:editable="false"只在inputtype (android:inputType="ANY_VALUE")为Edittext中给出的时才能工作。

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

这个组合对我很有效:

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

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

    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();


}
});

< >强简短的回答: 我使用android:focusable="false",它工作。

.

.

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
}
}
}

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

<EditText
android:enabled="false"
android:textColor="#000000"/>

你可以通过以下方法在edittext和editable之间切换:

public void toggleEditableOfEditText(EditText editText){
if (editText.getKeyListener() != null) {
editText.setTag(editText.getKeyListener());
editText.setKeyListener(null);
} else {
editText.setKeyListener((KeyListener) editText.getTag());
}
}

然后使用这个方法使edittext可编辑或不可编辑:

toggleEditableOfEditText(editText);