选择器将更改应用于所有视图而不是单击视图

时间:2012-12-11 17:34:29

标签: android android-custom-view viewgroup

我正在努力为Android中的拖放网格中的视图添加onClick突出显示。项目在GitHub上(dev分支包含使用选择器的代码)。

当我将onClick选择器设置为视图的背景时,我遇到的问题是在适配器中,当我单击一个视图时,选择器不会仅更改该视图的背景,而是更改所有视图的背景。

我很确定这是ViewGroup(下面)中onTouch处理点击的结果。我不确定我是否应该以不同方式返回true / false或以不同方式触发onClick侦听器以防止突出显示所有视图。

感谢任何想法/帮助。

@Override
public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    switch (action & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        touchDown(event);
        break;
    case MotionEvent.ACTION_MOVE:
        touchMove(event);
        break;
    case MotionEvent.ACTION_UP:
        touchUp(event);
        break;
    }
    if (aViewIsDragged())
        return true;
    return false;
}

private void touchUp(MotionEvent event) {
    if(dragged == -1) {
        if(onClickListener != null) {
            View clickedView = getChildAt(getTargetAtCoor((int) event.getX(), (int) event.getY()));
            if(clickedView != null)
                onClickListener.onClick(clickedView);
        }
    } else {
        manageChildrenReordering();
        hideDeleteView();
        cancelEdgeTimer();

        movingView = false;
        dragged = -1;
        lastTarget = -1;
        container.enableScroll();
        cancelAnimations();
    }
}
编辑:查看ViewGroup文档后android:addStatesFromChildren听起来像我正在寻找的,但它似乎没有任何影响。

  

机器人:addStatesFromChildren

     

设置此ViewGroup的可绘制状态是否也包含它   儿童的可绘制状态。例如,这用于组成一个组   当其子EditText或按钮聚焦时,它似乎是聚焦的。

     

必须是布尔值,“true”或“false”。

     

这也可能是对资源的引用(在表单中)   “@ [package:] type:name”)或主题属性(在表单中   “?[package:] [type:] name”)包含此类型的值。

     

这对应于全局属性资源符号   addStatesFromChildren。

更新

我找到了解决这个问题的方法。拉取请求为here

1 个答案:

答案 0 :(得分:2)

修改

layout.setClickable(true);添加到视图功能(第133和156行之间的某处)以使每个项目可单击。这是他们拥有自己的可选状态所必需的。没有它,网格正在接收触摸,并且该状态被传递给每个孩子。这打破了你的onTouch功能,但这将是一个单独的问题。

如果您不想担心更改onTouch的功能,可以手动更改不同触摸功能中所选项目的背景,而不是使用选择器


原来错过了这一点:

也许我错过了一些东西,但我认为你可以从onTouch传递View“v”并将其用作clickedView,而不是试图找出它基于位置的视图。