【问题标题】:How to do something after user clicks on my EditText用户点击我的 EditText 后如何做某事
【发布时间】:2010-01-22 17:17:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: android android-edittext onclicklistener


    【解决方案1】:

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

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

    【讨论】:

    • 还有 android:focusable 可以在触摸和非触摸模式下工作
    • 这里很重要,如果你想做一些额外的动作,比如显示键盘,如果你添加这个,键盘就不能再输入了:(
    • 感谢您的回答很有帮助
    【解决方案2】:

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

    【讨论】:

    • 我会选择这个作为通用问题“用户点击我的 EditText 后如何做某事”的正确答案。 xml 没有变化,键盘状态很容易管理。其他答案将 EditText 变成一个按钮。
    • 谢谢!我需要这个在我的EditText 上添加一个selectAll(),所以我仍然希望键盘能够启动。返回 false 并且有效。
    【解决方案3】:

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

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

    【讨论】:

    • 我只想使用 EditText,因为它在我的应用程序中看起来比按钮好得多。我知道我可以通过使用带有适当可绘制对象的按钮来实现相同的效果,但仅使用编辑文本更简单(我不必创建可绘制对象等)
    • 请注意...您不必真正创建任何可绘制对象,只需告诉按钮使用 EditText 的可绘制对象即可。
    • 在这种情况下,请在 EditText 视图上尝试 android:editable="false"。您应该仍然能够捕获 onClick 事件,但由于它不可编辑,因此不应弹出软键盘。
    • 使用带有自定义drawable和一些xml属性的Button毕竟非常简单,谢谢帮助。
    【解决方案4】:

    我通过使用这样的自定义按钮解决了这个问题:

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

    【讨论】:

      【解决方案5】:

      使用文本更改侦听器代替触摸侦听器:

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

      【讨论】:

        【解决方案6】:

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

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

        已弃用,但可以解决问题。

        【讨论】:

        • 为我工作。有什么问题?
        • 使用您的代码,键盘不会打开,但它仍然会在第二次点击时调用我的 onClick(),而不是在第一次点击时。我在 Android 2.0.1 上对其进行了测试,我的应用具有 minSdk 3。
        • 我遇到了与上面提到的@fhucho 相同的行为。这是我在 EditText 对象上设置的属性:&lt;EditText android:clickable="true" android:editable="false" android:inputType="none" &lt;!-- disables the keyboard from automatically showing up when one taps inside of the EditText --&gt; android:textSize="18sp" /&gt; 无论如何都可以在第一次点击时触发事件?而不是第二次点击?类似于 iOS 的 - (void)textFieldDidBeginEditing:(UITextField *)textField 委托?提前致谢!科尔
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 2012-10-24
        • 2019-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多