私の Android アプリケーションには、ビュー ページャーを使用して 4 つ以上のページ (フラグメント) を表示するアクティビティがあります。以下を呼び出してページ間を移動するボタンを各画面に実装しました。
pager.setCurrentItem(position, true);
ビューページャーとフラグメントはすべて、希望どおりに機能しています。次に、ページ間の遷移がボタンのみで処理されるように、ユーザーによるページ間のスワイプを無効にするソリューションを探し始めました。私が見つけた解決策は、スタックオーバーフローのいくつかの記事とこのブログで言及されており、ビューページャーをサブクラス化してタッチイベントをインターセプトしてスワイプを無効にすることを提案しています。これらの例に従い、ビュー ページャー クラスを次のようにサブクラス化しました。
public class ViewPager extends android.support.v4.view.ViewPager {
private boolean enabled;
public ViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onInterceptTouchEvent(event);
}
return false;
}
public void setSwipingEnabled(boolean enabled) {
this.enabled = enabled;
}
}
サブクラス化されたビュー ページャーの使用と呼び出しsetSwipingEnabled(false)
は、希望どおりに機能します。ユーザーはスワイプ ジェスチャでページ間を移動できなくなりましたが、呼び出しによるボタン クリックでページ間を移動できますsetCurrentItem(int position, boolean smoothScroll)
。ただし、サブクラスを使用すると、ページ間のアニメーションが中断されます。setCurrentItem(position, true)
android.support.v4.view.ViewPager で呼び出すと、ページ間で非常にきれいなスクロール アニメーションが表示されます。サブクラスを使用して同じ呼び出しを行うと、画面に非常に短い「フラッシュ」が表示され、新しいページが自動的に描画されます。
ページ間のユーザーのスワイプを無効にする機能を保持しながら、アニメーションを修正する方法を知りたいです。これについて何か助けていただければ幸いです。追加情報が必要な場合はお知らせください。これまでのところ、2.3.5 を実行する Samsung デバイスと Android 2.3.3 をターゲットとする AVD エミュレーターを使用してテストしました。
アップデート:
運が良ければ解決策が見つかることを期待して、いくつかのことを試しました。私が拡張しているソースコードを調べたandroid.support.v4.view.ViewPager
ところ、その実際のスクロールコードの「ほとんど」がonTouchEvent(MotionEvent event)
メソッドにあることがわかりました。サブクラス化する代わりに、通常のビューページャーを使用して、以下を呼び出してタッチイベントを消費しました。
pager.setOnTouchListener(new View.onTouchListener() {
@Override
public boolean onTouchEvent(MotionEvent event) {
return true;
}
});
これを行うと部分的に機能しました。これにより、スワイプによって次のビューへのスクロールがトリガーされなくなります。ただし、onInterceptTouchEvent(MotionEvent event)
android.support.v4.view.ViewPager のメソッドは、タッチ イベントをonTouchEvent()
メソッドに渡す前に、インターセプトの一部として小さなスクロールを行います。ViewPager をサブクラス化しないと、この動作を変更する方法がわかりません。