LoginSignup
13
13

More than 5 years have passed since last update.

ViewPagerをネストさせたとき、子ViewPagerのスワイプイベントを無効にしたい

Posted at
                            やつを追う前に言っておくッ!
                    おれは今ViewPagerをほんのちょっぴりだが体験した
                  い…いや…体験したというよりはまったく理解を超えていたのだが……
         ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|          あ…ありのまま 今 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|       『おれはViewPagerを入れていたと
        i|:!ヾ、_ノ/ u {:}//ヘ        思ったらいつのまにかViewPagerしていた』
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人        な… 何を言ってるのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ        おれも何をされたのかわからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ        頭がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -―一ァ‐゙T´ '"´ /::::/-‐  \    催眠術だとか超スピードだとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ  もっと恐ろしいものの片鱗を味わったぜ…

やりたいこと

タイトルと同じこと言ってますが、親ViewPagerだけスワイプ操作を受け付けるようにしたかったのです。

素直にViewPagerをネストさせたときの挙動

どうなるでしょうか。

親ViewPagerの中に子ViewPagerを入れた状態でスワイプすると、子ViewPager上でイベントが消化されます。
なので子ViewPagerの中身が切り替わります。

上の挙動は至極当然です。
が、期待してる挙動とは違うので何かしらの処理が必要です。

やりたいことを解決する

ViewPagerのドキュメントを読んでいたらcanScrollHorizontallyというメソッドがありました。

子ViewPagerを拡張して、canScrollHorizontallyが常にfalseを返すように書き換えれば子ViewPagerのスワイプ処理は無視され、親ViewPagerにイベントが移譲されます。
これで解決したはず。

IgnoreSwipeViewPager.java
public class IgnoreSwipeViewPager extends ViewPager {

  public RecommendItemViewPager(Context context) {
    super(context);
  }

  public RecommendItemViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  @Override
  public boolean canScrollHorizontally(int direction) {
    return false;
  }
}

Touch系のイベントのハンドラ各種をイジらないとダメか。。と畏怖してたけど、簡単に解決できてよかった。

13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13