Android EditText onClickListener

我想要一个EditText当按下时创build一个DatePicker。 所以我写下一个代码:

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

但是当我按EditText的动作是典型的:一个等待input文字的光标,而不是显示我想要的对话框。

任何想法?

谢谢

作者更新:尽pipe当时被接受(在埃克莱尔时代),下面的回应在很大程度上是无关紧要的。 自从这个标准写成以后,UX标准已经有了很大的发展。 为了完整性而保留,因为你不能删除一个被接受的答案。

EditText获取焦点时popup一个对话框就像是一个非标准的接口。 考虑到EditText的正常function是完全绕过的,因为你甚至不能更改你select的date,因为每次你给它的焦点,你popup这个对话框。

既然你正在使用它作为一个TextView,为什么不只是使用一个实际的TextView与一个button? 当button被点击时,调出DatePicker并以所需的格式调用TextView.setText()。 你可以使用button的onClickListener,它会像你期望的那样工作。 我相信这会使用户的function更清晰。

当EditText获得焦点时,键盘似乎popup。 为了防止这种情况,请将焦点设置为false:

 <EditText ... android:focusable="false" ... /> 

这种行为可以在不同厂商的Android操作系统风格上有所不同,但在我testing过的设备上,我发现这已经足够了。 如果键盘仍然popup,使用提示而不是文本似乎也有帮助:

 myEditText.setText("My text"); // instead of this... myEditText.setHint("My text"); // try this 

一旦你这样做了,你的点击监听器应该按照需要工作:

 myEditText.setOnClickListener(new OnClickListener() {...}); 

通常情况下,您需要最大程度地兼容EditText的正常行为。

所以你不应该使用android:focusable="false"因为这个视图不再是可以聚焦的,这看起来很糟糕。 例如,背景可绘制将不再显示其“已按下”状态。

你应该做的是以下几点:

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

通过将inputtypes设置为TYPE_NULL ,可以防止软件键盘popup。

通过设置OnClickListenerOnFocusChangeListener ,确保当用户点击EditText字段时,对话将始终打开,无论是获得焦点(第一次单击)还是后续点击。

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

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

 <EditText android:id="@+id/date" android:focusable="false"/> 

我希望这有助于任何有类似问题的人!

这是我实施的解决scheme

 mPickDate.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { showDialog(DATE_DIALOG_ID); return false; } }); 

要么

 mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { showDialog(DATE_DIALOG_ID); } }); 

亲自查看差异。 问题是因为(像RickNotFred说)TextView通过DatePicker显示date和编辑。 TextEdit不用于其主要目的。 如果你想让DatePicker重新popup,你需要inputdelete(第一种情况)或者de focus(第二种情况)。

射线

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

EditText获取焦点时popup一个对话框就像是一个非标准的接口。

显示一个对话框来编辑使用者按下EditText的date与默认的非常相似,即显示一个键盘一个数字键盘。 事实上,date显示与EditText信号的用户,该date可能会改变。 将date显示为不可编辑的TextView会向用户发出date不可更改的信号。

以下对我完全适用。

首先将您的dateselect器小部件的input设置为“无”,以防止popup软键盘:

 <EditText android:inputType="none" ... ></EditText> 

然后添加这些事件侦听器来显示包含dateselect器的对话框:

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

最后一件事。 为了确保键入date,月份或年份从dateselect器正确复制,请在检索值之前调用datePicker.clearFocus() ,例如通过getMonth()

很好的话题。 那么,我已经这样做了。 在XML文件中:

 <EditText ... android:editable="false" android:inputType="none" /> 

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

这是为我工作

将可编辑设置为false

 <EditText android:id="@+id/dob" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="Date of Birth" android:inputType="none" android:editable="false" 

/>

然后为OnFocusChange添加一个事件侦听器

 private View.OnFocusChangeListener onFocusChangeDOB= new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus){ showDialog(DATE_DIALOG_ID); } } }; 

正如狄龙·卡恩斯(Dillon Kearns)所build议的那样,把焦点放在虚假的工作上。 但是,如果您的目标是单击EditText时取消键盘,则可能需要使用:

 mEditText.setInputType(0); 

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" /> 

为什么没有人提到setOnTouchListener ? 使用setOnTouchListener很简单,只要返回true,如果侦听器已经消耗了事件,否则返回false。

这适用于我:

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