触摸事件从子节点到父节点的调度不好 - 源添加

时间:2012-05-01 12:50:19

标签: android events selector

我有一个线性布局,可以保存内部(子)自定义图像视图。

我的目标是在图像视图上设置背景选择器,并设置一个监听器 线性布局。

但是,我不能让选择器和监听器一起工作。 我不知道如何处理这些事件。

如果我快速点击它是有效的,但如果我在视图上拖动手指,则图像视图 仍处于选定状态。

这是一个活动,它引用了线性布局及其听众。

public class EventDispatchingDemoActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.my_layout);

        linearLayout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v)
            {
                Toast.makeText(getBaseContext(), "Click", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

这是自定义视图(我在某处找到的代码,作者的信用)

public class ImageSelector extends ImageView
{

    public ImageSelector(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        setBackgroundDrawable(new NavStateListDrawable(getContext(), 0));
        setClickable(true);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        super.onTouchEvent(event);
        return false;
    }

    public class NavStateListDrawable extends StateListDrawable
    {

        private int level;

        public NavStateListDrawable(Context context, int level)
        {

            this.level = level;
            // int stateChecked = android.R.attr.state_checked;
            int stateFocused = android.R.attr.state_focused;
            int statePressed = android.R.attr.state_pressed;
            int stateSelected = android.R.attr.state_selected;

            addState(new int[] { stateSelected }, context.getResources().getDrawable(R.drawable.slide_feedback));
            addState(new int[] { statePressed }, context.getResources().getDrawable(R.drawable.slide_feedback));
            addState(new int[] { stateFocused }, context.getResources().getDrawable(R.drawable.slide_feedback));
            addState(new int[] { -stateFocused, -statePressed, -stateSelected }, context.getResources().getDrawable(android.R.color.transparent));
        }

        @Override
        protected boolean onStateChange(int[] stateSet)
        {

            boolean nowstate = super.onStateChange(stateSet);

            try
            {
                LayerDrawable defaultDrawable = (LayerDrawable) this.getCurrent();

                LevelListDrawable bar2 = (LevelListDrawable) defaultDrawable.findDrawableByLayerId(R.id.element_contact_image_selector);
                bar2.setLevel(level);
            }
            catch (Exception exception)
            {

            }

            return nowstate;
        }
    }
}

这是xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#acf1fa"
    android:gravity="center"
    android:orientation="vertical" >

    <!-- outer layout -->

    <LinearLayout
        android:id="@+id/my_layout"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#00ff00"
        android:gravity="center" >

        <!-- inner layout -->

        <dor.event.dispathing.ImageSelector
            android:id="@+id/inner_layout"
            android:layout_width="150dp"
            android:layout_height="150dp" />
    </LinearLayout>

</LinearLayout>

我上传了源码: http://www.filefactory.com/file/5ikfwyk9j5bx/n/EventDispatchingDemo.rar

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我记得在编写应用程序时遇到了类似的问题。

1)您是否尝试捕获列表视图中的行是否被单击?我想你想要`listView.setonItemClickListener'来获取每个行的点击次数而不是整个列表视图。

2)我相信当你有一个包含可点击项目的列表视图时,其中的可点击项目在捕获点击次数方面具有优先权。不仅仅是优先考虑,我相信他们阻止任何点击事件都不会被发送回父母的事件处理程序。

我认为一个有点可行的解决方案是将这些可点击项目的可聚焦性设置为false。一旦这些可点击的项目不再具有可聚焦性,列表视图行将获得焦点。另一种解决方案是使用descendantFocusability属性,该属性控制谁(整行或图像)获得第一次破解并拾取行内触发的事件。以下是其他一些似乎符合您需求的问题:

How to fire onListItemClick in Listactivity with buttons in list?

Android ListView with clickable items in it's rows causes problems continuing scrolling