如何在JAVA中使编辑文本不可编辑但可单击


91

是否可以使EditText可点击但不可编辑。

我不希望它是可编辑的(键盘不应该出现,我们也不能更改提示)

实际上,我只想将Edit文本简单地用作带有提示的图像(无法更改)。我知道实际的方式是使用ImageViewand和an TextView,但是我想尝试一下,EditText因为我将只使用一个视图而不是2。而且每件事都是动态的,因此没有XML。

对于上述要求,XML的解决方案是,android:editable="false"但我想在Java中使用它。

但,

如果我使用:-

et.setEnabled(false);

要么

 et.setKeyListener(null);

它使EditText不可编辑,但同时也使它不可单击。


设置et.setClickable(true)怎么样?它可能会起作用。
海因

已经尝试过....但是没有起作用...其他任何想法
Aamir Shah

1
也许尝试使用相对布局,并把一个空矩形或东西就EditText上的TOP,并尝试对RECT可点击的事情..
就业展才能计划

Answers:


168

这里的窍门是:-

et.setFocusable(false);
et.setClickable(true);

5
但是,如果您从任何字段中复制了一些值,则可以通过按lang点击并粘贴来粘贴该值。.任何想法如何删除
Rishabh Agrawal

11
@ANinJa您可以将long clickable设置为false,即et.setLongClickable(false);。
路易斯

嗯,光标在click / longclick上以一种怪异的方式突出显示了...但是我没有更好的方法。:/
Martin Pfeffer

1
完善!您可能需要添加et.setLongClickable(false)以避免复制/粘贴
thanhbinh84 '17

1
完美,您是医生吗?
伊曼·马拉希

22

您可以EditText通过使用Java代码来设置休假:-

edittext.setFocusable(false);
edittext.setClickable(true);

或使用XML文件中的以下代码作为EditText

android:editable="false" 
android:inputType="none"  

22

由于editable已被弃用。您可以在设计xml时使用它android:inputType可以在编码中用作InputType.TYPE_NULL

设计XML

<android.support.v7.widget.AppCompatEditText
    android:id="@+id/edt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="false"
    android:inputType="none"
    android:text="EditText"/>

编码

edt.setClickable(true);
edt.setFocusable(false);
edt.setInputType(InputType.TYPE_NULL);

以下是点击事件 edittext

edt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(YourActivity.this,"edt click", Toast.LENGTH_LONG).show();
    }
});

对我来说就像是一种魅力
Karim Bibars

8

你可以用这个

android:focusableInTouchMode="false"

使edittext在xml中不可编辑。对于clickable事件,您可以使用setOnTouchListener()事件执行类似的操作。

editText.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
                        //do your stuff here..
        return false;
    }
});

1
看起来在Android O中android:focusableInTouchMode="false"也是必需的(android:focusable="false"仅不起作用)。至少在DP2中。
xip

7

android:editable 已弃用,但您可以执行以下操作:

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

我使用了上面的cade作为edittext,使用了picker来设置数据。


7

Edittext 启用和禁用像这样的编辑

EditText edit = (EditText) findviewby(R.id.edittext);

通过java代码

edit.setEnabled(false); //non editable
edit.setEnabled(true); //editable

通过xml

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

0

对我而言,没有任何答案可以得出一个完全可行的解决方案。

我的修复程序展示https://www.youtube.com/watch?v=oUA4Cuxfdqc

指南(对菜鸟友好),请注意代码中的一些注释。

EditText名为EditTextDispatched.java的自定义创建Java类

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

/**
 * @author Martin Pfeffer
 * @see <a href="https://celox.io">https://celox.io</a>
 */
public class EditTextDispatched extends android.support.v7.widget.AppCompatEditText {

    private static final String TAG = "DispatchingEditText";

    private boolean editable = true;

    public EditTextDispatched(Context context) {
        super(context);
    }

    public EditTextDispatched(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditTextDispatched(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    // get the current state
    public boolean isEditable() {
        return editable;
    }

    // set your desired behaviour
    public void setEditable(boolean editable) {
        this.editable = editable;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent motionEvent) {

        if (editable) {
            // default behaviour of an EditText
            super.dispatchTouchEvent(motionEvent);
            return true;
        }

        // achieve the click-behaviour of a TextView (it's cuztom)
        ((RelativeLayout) getParent()).onTouchEvent(motionEvent);
        return true;
    }

}

参考 EditTextDispatched在您的xml中(您必须更改pgk-名称):

  <io.celox.brutus.EditTextDispatched
    android:id="@+id/row_field_value"
    style="@style/row_field_text_display"
    android:layout_alignParentBottom="true"
    android:text="@string/sample_field_value" />

调用:

private void changeEditTextBehaviour(EditTextDispatched value, boolean editable) {
    value.setEditable(editable);
    value.setEnabled(editable);
}


0

我知道这个问题已经得到解答,但是要给出一个最新的答案(即2018年),这里是我用来实现所要求的(即非输入或可编辑)效果的设置:

    val etUserLoc: EditText = themedEditText(R.style.Pale_Blue_Text_Bold_13) {
                id = R.id.et_comp_user_keys_var_user_location
                inputType = InputType.TYPE_NULL
                isClickable = true
                isFocusable = false
                textColor = resources.getColor(R.color.magenta)  // overrides the default theme color
                text = Editable.Factory.getInstance().newEditable(resources.getString(R.string.loc_swakopmund))
            }.lparams(width = matchConstraint, height = matchParent) {   }

是的,这是ANKO,因为我不再在任何Android项目中使用XML。“ inputType”负责“ isEditable”的弃用。


0

从2020年开始,如果您还关心可访问性,则应避免进行设置,et.setFocusable(false);因为这将使使用键盘导航无法访问EditText。

这是我的解决方案:

科特林

editText.isFocusableInTouchMode = false

editText.isLongClickable = false //this will prevent copy and paste

editText.setOnClickListener {
   // handle the click
   // this will automatically make the edittext clickable = true
}

-1

您也可以android:inputMethod="@null"在其中进行操作EditText,它不会显示光标或键盘,然后您可以轻松掌握点击设置监听器。

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.