100

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

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

实际上,我只想将编辑文本用作带有提示(无法更改)的图像。我知道实际的方法是使用 an ImageViewand one TextView,但我希望它尝试一下,EditText因为我将只使用一个视图而不是 2。而且每件事都是动态的,所以没有 XML。

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

但,

如果我使用:-

et.setEnabled(false);

或者

 et.setKeyListener(null);

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

4

11 回答 11

184

这里的诀窍是:-

et.setFocusable(false);
et.setClickable(true);
于 2012-12-30T13:30:40.327 回答
29

正如editable已弃用。您可以在设计 xml 时使用 none 或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();
    }
});
于 2018-08-08T07:57:56.980 回答
24

您可以EditText使用 java 代码作为休闲设置:-

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

或通过在 XML 文件中使用以下代码EditText

android:editable="false" 
android:inputType="none"  
于 2013-04-12T05:10:41.770 回答
9

你可以用这个..

android:focusableInTouchMode="false"

使edittext在xml中不可编辑。对于可点击事件,您可以使用setOnTouchListener()事件来做同样的事情......

editText.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
                        //do your stuff here..
        return false;
    }
});
于 2012-12-30T14:17:44.510 回答
8

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"/>
于 2017-06-20T10:55:49.400 回答
7

android:editable已弃用,但您可以像下面这样执行 stg:

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

我将上面的 cade 用于编辑文本,我使用选择器在其中设置数据。您可以使用输入布局。

于 2016-04-18T11:18:49.923 回答
1

自 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
}
于 2020-05-31T23:40:37.320 回答
0

对我来说,没有一个答案会产生一个完全可行的解决方案。

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

指南(noob-friendly),请注意代码中的一些注释。

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

}

在您的 xml 中引用EditTextDispatched(您必须更改 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);
}
于 2017-03-26T10:52:44.117 回答
0

也许你可以试试

editText.setEnabled(false);
于 2018-01-21T09:36:11.427 回答
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”弃用。

于 2018-07-04T19:32:25.003 回答
-1

你也可以android:inputMethod="@null"在你的EditText,它不会显示光标或键盘,然后你可以通过设置监听器轻松掌握点击。

于 2016-09-22T07:20:28.743 回答