自定义视图'CustomAutoCompleteTextView'已调用setOnTouchListener但未覆盖performClick

时间:2018-04-16 05:22:47

标签: android

我为AutocompleteTextView创建了一个onTouchListener。但onTouch()方法显示警告:

  

如果覆盖onTouchEvent或使用OnTouchListener的View也没有实现performClick并在检测到点击时调用它,则View可能无法正确处理辅助功能操作。理想情况下,处理点击操作的逻辑应放在View#performClick中,因为某些辅助功能服务会在发生单击操作时调用performClick。

我不明白这是什么意思。这是代码。

actvEntryCategory.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                try{
                    actvEntryCategory.clearFocus();
                    actvEntryCategory.requestFocus();
                }catch (Exception e){
                    Log.d("eEMP/EntryCreate", "Error raised at EntryCategory touch event due to " + e.toString());
                }
                return false;
            }
        });

我是Andoird的新手。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

AutocompleteTextView。但onTouch()方法显示警告:如果覆盖onTouchEvent或使用OnTouchListener的View也没有实现performClick

FROM DOCS

Handling custom touch events

自定义视图控件可能需要非标准的触摸事件行为。例如,自定义控件可以使用onTouchEvent(MotionEvent)侦听器方法来检测ACTION_DOWNACTION_UP事件并触发特殊的单击事件。为了保持与辅助功能服务的兼容性,处理此自定义单击事件的代码必须执行以下操作:

  1. 为解释的点击操作生成适当的AccessibilityEvent。

  2. 启用辅助功能服务,以便为无法使用触摸屏的用户执行自定义点击操作。

  3. 为了有效地处理这些需求,您的代码应该覆盖performClick()方法,该方法必须调用此方法的超级实现,然后执行click事件所需的任何操作。检测到自定义点击操作后,该代码应调用您的performClick()方法。以下代码示例演示了此模式。

      

    <强>解

    1. 使用 @SuppressLint("ClickableViewAccessibility") 忽略此警告
    2. 第二个解决方案您的自定义视图应覆盖performClick()方法
    3.   

      采样代码以覆盖文档

      中的 performClick() 方法
      class CustomTouchView extends View {
      
          public CustomTouchView(Context context) {
              super(context);
          }
      
          boolean mDownTouch = false;
      
          @Override
          public boolean onTouchEvent(MotionEvent event) {
              super.onTouchEvent(event);
      
              // Listening for the down and up touch events
              switch (event.getAction()) {
                  case MotionEvent.ACTION_DOWN:
                      mDownTouch = true;
                      return true;
      
                  case MotionEvent.ACTION_UP:
                      if (mDownTouch) {
                          mDownTouch = false;
                          performClick(); // Call this method to handle the response, and
                                          // thereby enable accessibility services to
                                          // perform this action for a user who cannot
                                          // click the touchscreen.
                          return true;
                      }
              }
              return false; // Return false for other touch events
          }
      
          @Override
          public boolean performClick() {
              // Calls the super implementation, which generates an AccessibilityEvent
              // and calls the onClick() listener on the view, if any
              super.performClick();
      
              // Handle the action for the custom click here
      
              return true;
          }
      }