我有一个显示时间的EditText
。用户点击EditText
后我想显示TimePickerDialog
,因此我将View.OnClickListener
设置为EditText
。
但是OnClickListener
表现得很奇怪 - 我触摸EditText
然后出现软件键盘(我不想要)。当我再次触摸时,最后调用OnClickListener.onClick()
并出现对话框。
如果我希望对话框立即显示,我该怎么办?
答案 0 :(得分:109)
与大多数其他控件不同,EditText
在系统处于“触摸模式”时是可聚焦的。第一次单击事件聚焦控件,而第二次单击事件实际触发OnClickListener
。如果您使用android:focusableInTouchMode
视图属性停用了触摸模式焦点,则OnClickListener
应按预期触发。
<EditText
android:text="@+id/EditText01"
android:id="@+id/EditText01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusableInTouchMode="false" />
答案 1 :(得分:44)
另一种解决方案是使用ontouchlistener
:
edittext.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(MotionEvent.ACTION_UP == event.getAction()) {
mQuaternion_1.setText("" + mQ1);
}
return true; // return is important...
}
});
如果它返回true
,则处理事件并且键盘不会弹出。如果你想让键盘仍然弹出并注册点击,你可以让它返回false
。
答案 2 :(得分:3)
听起来你不希望用户真正能够输入EditText。你只是希望他们能够通过时间选择器选择时间。那么为什么不只是一个弹出TimePickerDialog的按钮呢?您可以显示在TextView中选择的时间。
或者你可以用TimePicker视图替换EditText视图(不是对话框,只是常规视图)。
答案 3 :(得分:2)
我通过使用这样的自定义按钮解决了这个问题:
<Button
android:id="@+id/btTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="test"
android:textSize="20dp"
android:background="@android:drawable/edit_text" />
答案 4 :(得分:2)
而不是触摸侦听器使用文本更改侦听器:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//yourFunction();
}
@Override
public void afterTextChanged(Editable s) {
}
});
答案 5 :(得分:1)
如果我理解正确你只需要像
那样的东西<EditText android:text="@+id/EditText01" android:id="@+id/EditText01"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:clickable="true" android:inputType="none" />
不可编辑且可点击。设置OnClickListener
即可完成。
从理论上讲,在实践中你也应该加上
android:editable="false"
已被弃用,但却可以解决问题。