如何在用户点击我的EditText后做些什么

我有一个EditText显示时间。 用户单击EditText我想显示一个TimePickerDialog ,所以我将一个View.OnClickListener设置为我的EditText

但是, OnClickListener行为怪异 – 我触摸EditText ,然后出现软件键盘(我不想)。 当我再次触摸时,最终调用OnClickListener.onClick()并出现对话框。

如果我想让对话立即出现,我该怎么办?

与大多数其他控件不同的是,当系统处于“触摸模式”时, EditText是可以聚焦的。 第一个点击事件关注控件,而第二个点击事件实际上会触发OnClickListener 。 如果使用android:focusableInTouchMode OnClickListener View属性禁用触摸模式焦点,则OnClickListener应按预期方式触发。

 <EditText android:text="@+id/EditText01" android:id="@+id/EditText01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusableInTouchMode="false" /> 

另一个解决scheme是使用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事件被处理,键盘不会popup。 如果你想要键盘仍popup并注册点击,你会有它返回false

这听起来像你不希望用户真的能够inputEditText。 你只是希望他们能够通过时间select器来select一个时间。 那么为什么不只是一个popupTimePickerDialog的button? 您可以显示在TextView中选取的时间。

或者你可以用TimePicker视图replaceEditText视图(不是对话框,只是一个常规的视图)。

我通过使用这样的自定义button来解决这个问题:

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

如果我理解正确,你只需要类似的东西

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

这是弃用,但伎俩。