如何在执行onLong点击视图后从ViewGroup(FrameLayout)获取特定(自定义)视图的索引

时间:2012-07-09 05:03:30

标签: android indexing viewgroup custom-view

有人可以帮助我使用我的语法吗?我正在动态地将一些视图(自定义视图)添加到已经在XML中定义的FrameLayout。那些自定义视图是不同类型或相同类型。我可以在屏幕上添加视图,但无法从ViewGroup中删除特定视图(类型相同或不同)。那些包含onTouch()的自定义视图。

我遇到问题:无法触发long click,始终需要touch listener

如果用户在长按

时选择一个视图,我必须在这里创建两个选项
  1. 更改背景颜色
  2. 删除视图。
  3. 编辑:根据tao建议,如果没有要查看的触摸侦听器,我可以获得长按视图的索引。但我必须实施触控听众以及长按......

    我该怎么做?

5 个答案:

答案 0 :(得分:3)

如果你的每个观点都有删除按钮或类似的东西,你可以这样做:

yourLayout.setTag(view);
删除部分

yourLayout.setOnLongClickListener(new Button.OnLongClickListener() {
        public boolean onLongClick(View view) {
...
...
yourLayout.removeView((View) view.getTag());
return _value;
}

我希望它可以帮到你。

答案 1 :(得分:3)

好吧,你的问题是“无法触发长时间点击,总是需要触摸听众”,但这不是必须的。我需要更多细节:

  1. 您应该处理长按,父视图或子视图的哪个视图?
  2. 你用来处理长按的监听器,android.view.View.setOnLongClickListener或android.view.GestureDetector?
  3. 实际上我上周完成了同样的工作。我的经验是:不要使用android.view.View.setOnLongClickListener,也不要使用android.view.GestureDetector,单独处理父视图的长按。 View.java就是一个很好的例子。


    修改

    我手上没有编译器,所以我只输入伪代码来处理自己的长按,对于真实代码,View.java会给你最好的答案。

    首先,您需要一个runnable来实现您的行动

    class CheckForLongPress implements Runnable {
        public void run() {
            if (getParent() != null) {
                // show toast
            }
        }
    }
    

    其次,修改onTouchEvent以检测长按

    boolean onTouchEvent(...) {
        switch (event.getAction()) {
            case MotionEvent.ACITON_DOWN:
                // post a delayed runnable to detecting long press action.
                // here mPendingCheckForLongPress is instance of CheckForLongPress
                postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLongPressTimeout());
                ...
                break;
    
            case MotionEvent.ACTION_MOVE:
                // cancel long press action
                if (distance(event, lastMotionEvent) > mTouchSlop) {
                    removeCallbacks(mPendingCheckForLongPress);
                }
    
                ...
    
                break;
    
            case MotionEvent.ACTION_UP:
                // cancel long press action
                removeCallbacks(mPendingCheckForLongPress);
    
                ...
    
                break;
    

    再次编辑:

    以下是真正的代码,而不是伪代码,这非常简单,并展示了如何在View.onTouchEvent()中处理长按,可能会有所帮助。

    public class ItemView extends View {
    
        public ItemView(Context context) {
            super(context);
        }   
    
        public ItemView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public ItemView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        Runnable mLongPressDetector = new Runnable() {
                public void run() {
                    Toast.makeText(getContext(), "Hello long press", Toast.LENGTH_SHORT).show();
                }
            };
    
        MotionEvent mLastEvent;
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            mLastEvent = MotionEvent.obtain(event);
    
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                postDelayed(mLongPressDetector, ViewConfiguration.getLongPressTimeout());
                break;
    
            case MotionEvent.ACTION_MOVE:
                final int slop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
                if (Math.abs(mLastEvent.getX() - event.getX()) > slop ||
                    Math.abs(mLastEvent.getY() - event.getY()) > slop) {
                    removeCallbacks(mLongPressDetector);
                }
                break;
    
            case MotionEvent.ACTION_UP:
                removeCallbacks(mLongPressDetector);
                break;
    
            }
            return true;
        }
    
    }
    

答案 2 :(得分:1)

看这里:

http://developer.android.com/reference/android/view/View.html

有一个int getId()方法。所以每个观点都有独特的观念。你可以用它来永远观看。

答案 3 :(得分:1)

  

我的问题是如何从中识别所选视图   用户触摸该视图时的一组视图。

我假设TwoPointsDraw& OnePointDraw正在扩展View。

所以在这种情况下,你可以做的是在创建TwoPointsDraw.assign对象的唯一标识或标记之后。

TwoPointsDraw drawView = new TwoPointsDraw(context);
drawView.setTag("unique identifier"); <-Must be object type
drawView.setId(unique id); <-must be integer type

当您点击特定视图时。您可以使用。

检查其身份

view.getTag()view.getId()

代码段应该看起来像

circle.setOnLongClickListener(new OnLongClickListener() {

    @Override
    public boolean onLongClick(View v) {
        Log.i("Long", v.getTag().toString());
        return false;
    }
});

希望这会对你有所帮助。

答案 4 :(得分:1)

要使OnLongClickListener正常工作,当你在onTouch函数中检测到长按时,你应该返回false!

例如:

在你的GestureDetector中,为了给你的onLongClickListener提供机会,你应该:

@Override
public boolean onDown(MotionEvent ev) {
    return false;
    // return super.onTouchEvent(ev);
}

否则:

在您的视图中,实现setOnLongClickListener函数并保存onLongClickListener传递的实例。每当检测到长按时,请调用实例的onLongClick函数。