我有一个画廊。每个幻灯片里面都有一个按钮。
我有一个自定义布局,我正在给幻灯片充气。
附加了按钮的点击监听器,它运行良好,画廊也正常滚动。
但是当我按下按钮外的画廊时,按钮也会按下并变为蓝色。这不会触发按钮的onClickListener。但它使按钮看起来像按下了,我不希望这样。
尝试将库的所有侦听器设置为空实现但没有效果......
提前致谢。
编辑:附加一个空的单击侦听器到自定义布局,现在按钮不再变为蓝色,但画廊不会滚动,因为事件已被消耗。会看到可以做些什么...
答案 0 :(得分:0)
为此找到了解决方法。这太可怕了,但确实有效。
首先,Gallery负责我的问题的代码部分是这样的:
public boolean onDown(MotionEvent e) {
// Kill any existing fling/scroll
mFlingRunnable.stop(false);
// Get the item's view that was touched
mDownTouchPosition = pointToPosition((int) e.getX(), (int) e.getY());
if (mDownTouchPosition >= 0) {
mDownTouchView = getChildAt(mDownTouchPosition - mFirstPosition);
mDownTouchView.setPressed(true);
}
// Reset the multiple-scroll tracking state
mIsFirstScroll = true;
// Must return true to get matching events for this down event.
return true;
}
更确切地说,这一行:
mDownTouchView.setPressed(true);
这里我的幻灯片的布局被按下了,并且lineLayout的setPressed的默认行为是将它发送给所有孩子,所以所有孩子都被按下了。
首先,我尝试创建Gallery的子类并覆盖onDown。如果我只是返回false而没有别的,那就有效了,但幻灯片在触摸时跳到下一张幻灯片的行为很奇怪。那是因为这一行:
mFlingRunnable.stop(false);
哪个没被执行。由于此变量是私有的并且与Gallery类中的其他所有内容相关,因此我没有找到从子类中使用它的方法。我也尝试复制所有的Gallery代码,但它也没有用,因为它使用了许多只有包访问权限等的东西。
所以我创建了一个LinearLayout的子类,它覆盖onSetPressed:
public class LinearLayoutOnSetPressedDoNothing extends LinearLayout {
public LinearLayoutOnSetPressedDoNothing(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setPressed(boolean pressed) {
}
}
在我的布局中使用它而不是LinearLayout:
<?xml version="1.0" encoding="utf-8"?>
<com.test.LinearLayoutOnPressDoNothing
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- content -->
</com.test.LinearLayoutOnPressDoNothing>
嗯,这很有效。