【问题标题】:Select only one children in custom layout per time每次只在自定义布局中选择一个孩子
【发布时间】:2012-08-25 22:20:29
【问题描述】:

我对此感到困惑:我有一个 ViewGroup 托管几个视图。所有视图都有布局参数:match_parent/match_parent。视图可以像在图片上一样被放置在另一个之上。

应选择触摸事件视图(如果在其填充的矩形上发生点击)并且每次只能选择一个视图。

实现这一点的最佳方法是什么?

UPD:

视图中的代码:

@Override
public boolean onTouchEvent(MotionEvent event) {
    float eventX = event.getX();
    float eventY = event.getY();
    // if it's over filled area
    if (mBounds.contains((int)eventX, (int)eventY)) {
        // set current view selected or perform other stuff
        // also at this moment we need to unselect all siblings
        mGestureDetector.onTouchEvent(event); 
        return true;
    } else {
        setSelected(false);
        return false;
    }
}

【问题讨论】:

    标签: android view custom-component viewgroup


    【解决方案1】:

    创建一个表示在自定义ViewGroup 中选择的当前子View 的字段。当您遇到触摸事件时,请检查您是否选择了以前的 View 以及是否有可能是相同的视图。如果不是,则取消选中上一个视图并使其指向当前视图。我猜测发布的代码是针对子视图的,在这种情况下,您可以创建一个回调接口,其中父 ViewGroup 实现了每次选择视图时都会调用的接口。下面是一个小模板:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float eventX = event.getX();
        float eventY = event.getY();
        // if it's over filled area
        if (mBounds.contains((int)eventX, (int)eventY)) {
            mListener.onViewSelected(this);
            // set current view selected or perform other stuff
            // also at this moment we need to unselect all siblings
            mGestureDetector.onTouchEvent(event); 
            return true;
        } else {
            setSelected(false);
            return false;
        }
    }
    

    在父ViewGroup:

    public class NiceViewGroup extends ViewGroup implements OnViewSelected {
    
       private View mCurrentSelectedView = null;
    
       public void onViewselected(View selected) {
            if (mCurrentSelectedView == null || mCurrentSelectedView == selected) {
                 return;
            } else {
                 mCurrentSelectedView.unselectView();
                 mCurrentSelectedView = selected;      
            }    
       }        
    

    当然,当您创建子视图时,您必须将父 ViewGroup 作为侦听器传递。

    【讨论】:

      【解决方案2】:

      在您的视图中添加对 onClickListeners 的支持(默认不支持)

      public class myCustomView extends View {
          boolean clicking = false;
          OnClickListener onClickListener;
      
          public void setOnClickListener(OnClickListener ocl) {
              onClickListener = ocl;
          }
      
          @Override
          public boolean onTouchEvent(MotionEvent ev) {
              switch (ev.getAction) {
              case MotionEvent.ACTION_DOWN:
              case MotionEvent.ACTION_MOVE:
                  boolean clicking = true;
                  return true;
              case MotionEvent.ACTION_UP:
                  if (clicking) {
                      if (onClickListener != null) {
                          onClickListener.onClick(this);
                      }
                      clicking = false;
                      return true;
                  }
                  return false;
              default:
                  clicking = false;
                  return false;
              }
          }
      

      【讨论】:

      • 抱歉,不清楚,编辑了问题。问题是如果已经选择了任何其他视图,如何取消选择所有其他视图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2012-12-07
      • 1970-01-01
      相关资源
      最近更新 更多