画廊/适配器视图子项绘制状态

7
我正在使用一个画廊视图,其中每个项目对应的视图都是非平凡的,包括文本和多个按钮。
当我点击拖动画廊视图(不在任何一个按钮上)时,按钮的可绘制状态会改变为按下,并且所有按钮似乎都被按下了。此外,选择状态也会发生相同的行为(例如,所有子TextView的文本颜色都会改变)。
我试图防止这种行为,并找到了android:duplicateParentState xml属性以及setDuplicateParentStateEnabled属性。这似乎可以实现我想做的事情,但它似乎没有效果。
有什么想法吗?
3个回答

8
也许有点晚了,但我最近也遇到了这个问题,并找到了解决方法。
dispatchSetSelected和dispatchSetPressed在这里并没有帮助,因为您实际需要重写的方法是Gallery内部的私有方法。
解决方案是在子视图周围添加一个额外的布局(我使用LinearLayout的子类),它覆盖了setPressed(boolean)并简单地忽略它。 这可以防止Gallery强制其按下状态对子项进行干扰,同时仍允许这些子项直接激活,并且不会停止事件向上传播。

惊人的修复!有没有人知道这是否是Android上报告的错误?看起来并不是预期的行为。 - MikeIsrael

3

不确定duplicateParentState属性在哪里发挥作用,但是查看源代码后发现它并没有考虑到选中和按下状态。我创建了一个自定义视图类并重写了dispatchSetSelected和dispatchSetPressed方法。


1
如果您想要扩展Gallery以创建自己的定制版本,您可以简单地执行以下操作:
  @Override
  public boolean onDown(MotionEvent e) {
    // Ignore onDown events in order to avoid having every child's state set to 'pressed'
    return true;
  }

这仍将允许自定义图库的子项正常接收点击事件,并且滑动/飞扬也能按预期工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接