2010-01-22 34 views
48

我有一个显示时间的EditText。用户点击EditText后,我想显示TimePickerDialog,因此我将View.OnClickListener设置为我的EditText如何在用户点击我的EditText后执行某些操作

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

如果我希望对话框立即出现,我应该怎么做?

回答

99

不同于大多数其他控件,EditText s为可聚焦在系统处于“触摸模式”。第一次点击事件关注控件,而第二次点击事件实际上触发了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" /> 
+2

还有android:focusable,它可以在触摸和非触摸模式下工作 – Keith 2012-05-22 00:46:13

+0

有用的答案..感谢很多 – Ranjit 2013-09-23 13:13:39

+5

重要的是,如果你想做一些额外的动作,如显示键盘,如果你添加这个,键盘不是能够输入onymore :( – cV2 2015-01-15 17:02:19

3

这听起来像你不希望用户真的能够输入EditText。你只是希望他们能够通过时间选择器来选择时间。那么为什么不只是一个弹出TimePickerDialog的按钮呢?您可以显示在TextView中选取的时间。

或者您可以用TimePicker视图(不是对话框,只是常规视图)替换EditText视图。

+0

我只想使用EditText,因为它在我的应用程序中看起来比按钮更好。我知道我可以通过使用带有适当可绘制按钮的按钮来获得相同的效果,但只是使用edittext更简单(我不必创建绘图等)。 – fhucho 2010-01-22 17:54:42

+0

只是一个笔记...你不必真的创建任何只要告诉按钮使用EditText的drawable即可。 – 2010-01-22 18:13:28

+0

在这种情况下,请在您的EditText视图上尝试android:editable =“false”。您仍然应该能够捕获onClick事件,但由于它不可编辑,软键盘不应弹出。 – 2010-01-22 18:38:34

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" 

它被废弃了,但做的伎俩。

+0

不幸的是,这不起作用... – fhucho 2010-01-22 21:54:49

+0

为我工作。有什么问题 ? – 2010-01-22 22:11:47

+0

使用您的代码,键盘无法打开,但仍然会在第二次点击时调用我的onClick(),而不是第一次。我在Android 2.0.1上测试了它,我的应用程序有minSdk 3。 – fhucho 2010-01-24 10:09:41

3

我解决了这个通过使用定制的按钮这样的:

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

另一种解决方案是使用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

+1

我会选择这个作为通用问题的正确答案“用户点击我后如何做某些事情EditText“,没有对xml和键盘状态的更改进行简单管理,其他答案将EditText转换为Button。 – ElYeante 2013-09-14 17:34:56

+0

谢谢!我需要在我的EditText上放置一个'selectAll()',所以我仍然需要键盘返回假,它工作。 – Azurespot 2016-05-16 04:46:08

+0

在我的方案中工作 – 2018-02-07 15:46:28

相关问题