2

我正在为 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听起来像我正在寻找的东西,但它似乎没有任何效果。

机器人:addStatesFromChildren

设置此 ViewGroup 的可绘制状态是否还包括其子级的可绘制状态。例如,这用于使一个组在其子 EditText 或按钮获得焦点时显示为焦点。

必须是布尔值,“真”或“假”。

这也可能是对包含此类型值的资源(形式为“@[package:]type:name”)或主题属性(形式为“?[package:][type:]name”)的引用.

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

更新

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

4

1 回答 1

2

编辑

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

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


错过了重点的原文:

也许我遗漏了一些东西,但我认为您可以从 onTouch 传递视图“v”并将其用作 clickedView,而不是试图根据位置确定它是哪个视图。

于 2012-12-19T16:51:24.113 回答