Can anyone tell me how to make an EditText
not editable via XML? I tried setting android:editable
to false
, but
- it is deprecated; and
- it didn't work.
Use this simple code:
textView.setKeyListener(null);
It works.
Edit : To add KeyListener
later, do following
1 : set key listener to tag of textView
textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);
2 : get key listener from tag and set it back to textView
textView.setKeyListener((KeyListener) textView.getTag());
They made "editable" deprecated but didn't provide a working corresponding one in inputType.
By the way, does inputType="none" has any effect? Using it or not does not make any difference as far as I see.
For example, the default editText is said to be single line. But you have to select an inputType for it to be single line. And if you select "none", it is still multiline.
As you mentioned android:editable is deprecated. android:inputType="none" should be used instead but it does not work due to a bug (https://code.google.com/p/android/issues/detail?id=2854)
But you can achieve the same thing by using focusable.
Via XML:
<EditText ...
android:focusable="false"
</EditText>
From code:
((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);
<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" />
and use following :
txtDate.setKeyListener(null);
I tried to do:
textView.setInputType( InputType.TYPE_NULL );
which should work, but for me it did not.
I finished with this code:
textView.setKeyListener(new NumberKeyListener() {
public int getInputType() {
return InputType.TYPE_NULL;
}
protected char[] getAcceptedChars() {
return new char[] {};
}
});
which works perfectly.
When I want an activity to not focus on the EditText and also not show keyboard when clicked, this is what worked for me.
Adding attributes to the main layout
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
and then the EditText field
android:focusable="false"
android:focusableInTouchMode="false"
Here is an example:
<?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>
In addition to @mahe madi you can try this as well
editText.setEnabled(false);
editor.setTextColor(Color.BLACK);
This method will hide cursor, lose focus and more importantly set text color to black behaving like TextView.
And to revert Back to editText simply do this to gain all the properties of EditText.
editText.setEnabled(true);
Hope it Helps :)
I've tried the following:
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();
}
});
but the problem was that if the edit text is the first in the form then it gets the focus and the pickCode() code which launches a new activity is called straight away. So I modified the code as follows and it seems to work quite well (except I cannot set the focus on the text edit but I don't need to):
itemCodeEditText.setFocusable(false);
this.itemCodeEditText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
pickItem();
}
});
Best Regards,
Comments welcome,
John Goche
I resolve this with a dialog.
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();
}
});
Kotlin extension option:
fun AppCompatAutoCompleteTextView.setEditable(editable: Boolean) {
if (!editable) {
this.tag = this.keyListener
this.keyListener = null
} else {
if(this.tag is KeyListener) {
[email protected] = [email protected] as KeyListener
}
}
}
EditText
style and permit scrolling, useUI.setReadOnly(myEditText, true)
from this library. There are a few properties that have to be set, which you can check out in the source code. – caw