0

ギャラリーを持っています。各スライドの内側にはボタンがあります。

スライドを膨らませるカスタムレイアウトがあります。

ボタンにクリック リスナーをアタッチすると、うまく機能し、ギャラリーも正常にスクロールします。

しかし、ボタンの外側のギャラリーを押すと、ボタンも押されて青色に変わります。これは、ボタンの onClickListener をトリガーしません。しかし、それはボタンが押されたように見えるので、私はそれを望んでいません。

ギャラリーのすべてのリスナーを空の実装に設定しようとしましたが、効果はありません...

前もって感謝します。

編集: 空のクリック リスナーをカスタム レイアウトにアタッチすると、ボタンが青色にならなくなりましたが、イベントが消費されるため、ギャラリーはスクロールしません。何ができるか見ていきます...

4

1 に答える 1

0

これに対する回避策が見つかりました。恐ろしいですが、うまくいきます。

まず第一に、私の問題の原因となっているギャラリーのコードの部分は次のとおりです。

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);

ここでスライドのレイアウトが押され、LinearLayout の setPressed のデフォルトの動作はすべての子にディスパッチされるため、すべての子が押されます。

まず Gallery のサブクラスを作って onDown をオーバーライドしてみました。false を返して他に何も返さなかった場合は機能しましたが、スライドに触れると次のスライドにジャンプするという奇妙な動作が発生しました。それは、次の行が原因でした。

 mFlingRunnable.stop(false);

これは実行されませんでした。この変数はプライベートで、Gallery クラスの他のすべてに関連しているため、サブクラスから使用する方法が見つかりませんでした。ギャラリーのコードもすべてコピーしてみましたが、パッケージ アクセスしかできないものがたくさん使用されているため、うまくいきませんでした。

そこで、onSetPressed をオーバーライドする LinearLayout のサブクラスを作成しました。

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>

そして、これはうまくいきます。

于 2012-06-05T15:06:55.533 に答える