1

私の 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 をサブクラス化しないと、この動作を変更する方法がわかりません。

4

0 に答える 0