Android EditText onClickListener

xge*_*86x 76 android android-edittext

我想要一个EditText,按下时会创建一个DatePicker.所以我写下一个代码:

    mEditInit = (EditText) findViewById(R.id.date_init);
    mEditInit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog(DATEINIT_DIALOG);
        }

    });
Run Code Online (Sandbox Code Playgroud)

但是当我按下EditText时,动作是典型的:等待键入文本的光标改为显示我想要的对话框.

任何的想法?

谢谢

小智 122

当EditText获得焦点时,键盘似乎会弹出.要防止这种情况,请将focusable设置为false:

<EditText
    ...
    android:focusable="false"
    ... />
Run Code Online (Sandbox Code Playgroud)

这种行为可能因不同制造商的Android操作系统风格而有所不同,但在我测试的设备上,我发现这已经足够了.如果键盘仍然弹出,使用提示而不是文本似乎也有帮助:

myEditText.setText("My text");    // instead of this...
myEditText.setHint("My text");    // try this
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您的on click侦听器应该按照需要运行:

myEditText.setOnClickListener(new OnClickListener() {...});
Run Code Online (Sandbox Code Playgroud)


caw*_*caw 54

通常,您希望最大程度地兼容EditText正常行为.

所以,你应该使用android:focusable="false"的,是的,视图将只是不可聚焦了它的日子也不好过.例如,背景drawable将不再显示其"按下"状态.

您应该做的是以下内容:

myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // showMyDialog();
    }
});
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            // showMyDialog();
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

通过将输入类型设置为TYPE_NULL,可以防止弹出软件键盘.

通过设置OnClickListenerOnFocusChangeListener,您可以确保在用户点击EditText字段时始终打开对话框,无论是获得焦点(第一次点击)还是后续点击.

只是设定android:inputType="none"setInputType(InputType.TYPE_NULL)不总是足够.对于某些设备,您也应该android:editable="false"在XML中设置,尽管它已被弃用.如果它不再起作用,它将被忽略(因为所有不支持的XML属性).

  • 完美的解决方案,应该是公认的答案 (4认同)
  • @caw 感谢您的回复,但我最终使用 onTouch 让它工作。谢谢! (2认同)

小智 31

我有同样的问题.代码很好,但请确保将EditText的可聚焦值更改为false.

<EditText
android:id="@+id/date"
android:focusable="false"/>
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助任何遇到类似问题的人!

  • 也不要设置enabled ="false",这将禁用onClickListener (4认同)

Aks*_*iya 22

默认工作EditText:首先单击它焦点,然后在第二次单击它处理,onClickListener所以你需要禁用焦点.然后在第一次单击onClickListener将处理.

为此,您需要将此android:focusableInTouchMode="false"属性添加到您的EditText.而已!

像这样的东西:

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="false"
        android:inputType="text" />
Run Code Online (Sandbox Code Playgroud)

  • 它可以工作,但是“EditText”变得不可编辑,并且光标不出现。 (4认同)

Ray*_*non 15

这是我实施的解决方案

mPickDate.setOnKeyListener(new View.OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        showDialog(DATE_DIALOG_ID);
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

要么

mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        showDialog(DATE_DIALOG_ID);

    }
});
Run Code Online (Sandbox Code Playgroud)

亲自看看差异.问题是因为(像RickNotFred所说)TextView通过DatePicker显示日期和编辑.TextEdit不用于其主要目的.如果要重新弹出DatePicker,则需要输入delete(第一种情况)或de focus(第二种情况).

射线

  • 除非你添加一个onClickListener,我刚刚与onFocusChangeListener一起做了.这将工作:-) (2认同)

V.M*_*rch 12

如果您在 EditText 上使用 OnClick 操作,例如:

爪哇:

mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATEINIT_DIALOG);
    }

});
Run Code Online (Sandbox Code Playgroud)

或科特林:

editTextChooseDate.setOnClickListener {
        showDialog(DATEINIT_DIALOG)
    }
Run Code Online (Sandbox Code Playgroud)

因此,如果xmlEditText输入以下几行,它将完美运行:

android:inputType="none
"
android:focusable="false" android:cursorVisible="false"

例如:

<EditText
            android:id="@+id/date_init" 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:hint="Select Date"
            android:inputType="none"
            android:focusable="false"
            android:cursorVisible="false"/>
Run Code Online (Sandbox Code Playgroud)

或 MaterialDesign

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/layoutEditTextChooseDate"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent">

    <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/date_init" 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:hint="Select Date"
            android:inputType="none"
            android:focusable="false"                      
            android:cursorVisible="false"/>

</com.google.android.material.textfield.TextInputLayout>
Run Code Online (Sandbox Code Playgroud)


fis*_*hjd 8

恕我直言,我不同意RickNotFred的声明:

当EditText获得焦点时弹出对话框似乎是非标准接口.

当用户按下EditText时,显示一个对话框来编辑日期与默认情况非常相似,即显示键盘数字键盘.使用EditText显示日期的信号向用户发出可能更改日期的信号.将日期显示为不可编辑的TextView会向用户发出可能不会更改日期的信号.


Luk*_*eau 6

以下对我来说非常适合.

首先将日期选择器窗口小部件的输入设置为"无",以防止弹出软键盘:

<EditText android:inputType="none" ... ></EditText>
Run Code Online (Sandbox Code Playgroud)

然后添加这些事件侦听器以显示包含日期选择器的对话框:

// Date picker
EditText dateEdit = (EditText) findViewById(R.id.date);
dateOfBirthEdit.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            showDialog(DIALOG_DATE_PICKER);
        }
        return false;
    }
});

dateEdit.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            showDialog(DIALOG_DATE_PICKER);
        } else {
            dismissDialog(DIALOG_DATE_PICKER);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

最后一件事.要确保从日期选择器中正确复制键入的日期,月份或年份,请datePicker.clearFocus()在检索值之前调用,例如通过getMonth().


Coo*_*ind 6

好主题.好吧,我已经这样做了.在XML文件中:

<EditText
    ...
    android:editable="false"
    android:inputType="none" />
Run Code Online (Sandbox Code Playgroud)

在Java代码中:

txtDay.setOnClickListener(onOnClickEvent);
txtDay.setOnFocusChangeListener(onFocusChangeEvent);

private View.OnClickListener onOnClickEvent = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        dpDialog.show();
    }
};
private View.OnFocusChangeListener onFocusChangeEvent = new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus)
            dpDialog.show();
    }
};
Run Code Online (Sandbox Code Playgroud)


Rah*_*mov 5

这对我有用:

mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setKeyListener(null);
mEditInit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus)
            {
                mEditInit.callOnClick();
            }
        }
    });
mEditInit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATEINIT_DIALOG);
    }

});
Run Code Online (Sandbox Code Playgroud)