【发布时间】:2012-12-11 17:34:28
【问题描述】:
我正在为 Android 拖放网格中的视图添加 onClick 突出显示。该项目位于GitHub(开发分支包含使用选择器的代码)。
当我将 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 听起来像是我正在寻找的东西,但似乎没有任何效果。
android:addStatesFromChildren
设置此 ViewGroup 的可绘制状态是否还包括其 儿童的可绘制状态。例如,这用于创建一个组 当其子 EditText 或按钮获得焦点时,似乎已获得焦点。
必须是布尔值,“真”或“假”。
这也可能是对资源的引用(形式为 “@[package:]type:name”)或主题属性(形式为 "?[package:][type:]name") 包含此类型的值。
这个对应全局属性资源符号 addStatesFromChildren。
更新
我找到了解决这个问题的方法。拉取请求是here
【问题讨论】:
-
有机会看到您的 onClickListener 方法吗?也许 performClick 可能会有所帮助?
-
onClickListener 只是对点击侦听器(本例中的活动)的引用,它只是创建一个 toast。我用 clickedView.performClick() 交换了 onClickListener.onClick(clickedView) 但同样的事情发生了,最重要的是点击监听器没有被调用
标签: android android-custom-view viewgroup