如何在按下图库幻灯片时禁用“按下”按钮?

时间:2012-06-05 13:26:46

标签: android gallery

我有一个画廊。每个幻灯片里面都有一个按钮。

我有一个自定义布局,我正在给幻灯片充气。

附加了按钮的点击监听器,它运行良好,画廊也正常滚动。

但是当我按下按钮外的画廊时,按钮也会按下并变为蓝色。这不会触发按钮的onClickListener。但它使按钮看起来像按下了,我不希望这样。

尝试将库的所有侦听器设置为空实现但没有效果......

提前致谢。

编辑:附加一个空的单击侦听器到自定义布局,现在按钮不再变为蓝色,但画廊不会滚动,因为事件已被消耗。会看到可以做些什么...

1 个答案:

答案 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>

嗯,这很有效。