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。
通过设置OnClickListener
和OnFocusChangeListener
,确保当用户点击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); } });
- 从parcelable,contentView或contentIntent提取通知文本
- 场景转换animation上的JNI错误 – 图层超过最大值
- 无法添加窗口android.view.ViewRoot$W@44da9bc0 – 此窗口types的权限被拒绝
- 找不到com.google.android.gms:play-services:3.1.59 3.2.25 4.0.30 4.1.32 4.2.40 4.2.42 4.3.23 4.4.52 5.0.77 5.0.89 5.2.08 6.1。 11 6.1.71 6.5.87
- Volley JsonObjectRequest发布请求不起作用
- 如何在android中添加button通知?
- 如何禁用Android中的家庭和其他系统button?
- 如何:语音命令到Android应用程序
- 哪个Android日志框架使用?