【问题标题】:Android adding onClick on soft keyboard on activityAndroid在活动上添加onClick软键盘
【发布时间】:2017-04-06 08:51:54
【问题描述】:

我正在尝试在软键盘上为活动添加 onClick。原因是我想检查用户当前是否处于活动状态。所以我所做的是,如果用户点击应用程序,我将重置不活动计时器。问题是当用户与软键盘交互时,它不会调用函数onUserInteraction(),这是我在活动中覆盖的函数。因此,如果我在活动中的每个文本字段等都单击了软键盘,我需要帮助找到一种方法来跟踪。 (我知道我可以在每个 EditText 字段上插入一个 onclick 侦听器,但我宁愿不这样做,因为如果我要使用许多 EditText 字段就不会那么好)

【问题讨论】:

  • 你能不能详细点。当前处于活动状态是什么意思 - 如果应用程序处于打开状态或用户正在屏幕上执行操作?
  • @Praga 表示用户正在屏幕上执行动作。
  • 那么你就不需要依赖键盘操作了。您可以选择 Faa km 的回答。
  • @Praga 好吧,问题是当我在软键盘上书写时它不会调用onKeyUp()。 (我在我的活动中覆盖了该方法)

标签: java android


【解决方案1】:

所以这就是我最终的结果。我希望有别的东西,但这解决了问题。感谢您的帮助!

public class ActivityEditText extends android.support.v7.widget.AppCompatEditText {
        private TextWatcher tw;
        public ActivityEditText(Context c)
        {
            super(c);
            this.setOurTCL();
        }

        public ActivityEditText(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.setOurTCL();
        }

        public ActivityEditText(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            this.setOurTCL();
        }

        private void setOurTCL()
        {
            this.tw = new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    InactivityManager.resetTime();
                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            };
            this.addTextChangedListener(this.tw);
        }

        @Override
        public void removeTextChangedListener(TextWatcher watcher) {
            if(!watcher.equals(this.tw))
                super.removeTextChangedListener(watcher);
        }
    }

【讨论】:

    【解决方案2】:

    要处理单个按键,请根据需要实现 onKeyDown() 或 onKeyUp()。通常,如果您想确保只收到一个事件,您应该使用 onKeyUp()。如果用户按住按钮,则会多次调用 onKeyDown()。

    【讨论】:

    • 试图在活动中实现它。但与软键盘交互时不调用
    • 键盘是一个不同的窗口。如果您不需要跟踪用户输入的内容,您可以考虑为每个 edittext 添加一个全局 textWatcher 并监听每次用户输入时都会调用的文本更改。
    • 是的,我知道这个问题的解决方案。我虽然希望有一个解决方案,我可以在活动中实现而不是每个编辑文本。但如果没有这样的解决方案,我将不得不回到那个解决方案。
    • 让你的activity实现textWatcher接口,并将“this”设置为每个编辑文本的监听器,这样你就不需要为每个视图实现了。或者您可以按照@suru 的建议编写自己的编辑文本子类
    【解决方案3】:

    创建一个类似UserInteractionEditText 的类并扩展EditText 并在该类中设置onclick lisetener 在所有XML 布局中使用该类,就像您使用EditText 一样,您可以执行以下操作:

        public class UserInteractionEditText extends EditText implements View.OnClickListener {
    
    
        public UserInteractionEditText(Context context) {
            super(context);
        }
    
        public UserInteractionEditText(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public UserInteractionEditText(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
    
        @Override
        public void onClick(View v) {
            //TODO:: Handle user Click Events
        }
    }
    

    【讨论】:

      【解决方案4】:

      您可以使用onUserInteraction()活动功能。您需要在活动中覆盖此功能。 当您与 Activity 进行任何类型的交互时,此函数会被调用。

       @Override
          public void onUserInteraction() {
              super.onUserInteraction();
              // Your code goes here
          }
      

      你可以参考this examplealso this answer,参考文档here

      希望这会有所帮助。

      【讨论】:

      • 正如我在描述中所说,我已经覆盖了该方法,但它似乎没有响应软键盘交互。
      • 您可以扩展edittext以创建customedittext并在其中添加textwatcher或处理onclick以检查您的不活动计时器,而不是对所有edittext进行操作
      猜你喜欢
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 2011-08-17
      • 2011-08-16
      • 2011-08-24
      • 1970-01-01
      相关资源
      最近更新 更多