我正在努力为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
答案 0 :(得分:2)
修改强>
将layout.setClickable(true);
添加到视图功能(第133和156行之间的某处)以使每个项目可单击。这是他们拥有自己的可选状态所必需的。没有它,网格正在接收触摸,并且该状态被传递给每个孩子。这打破了你的onTouch功能,但这将是一个单独的问题。
如果您不想担心更改onTouch的功能,可以手动更改不同触摸功能中所选项目的背景,而不是使用选择器
原来错过了这一点:
也许我错过了一些东西,但我认为你可以从onTouch传递View“v”并将其用作clickedView,而不是试图找出它基于位置的视图。