1

これは私の最初の投稿であり、コーディングの問題を英語で説明する最初の試みです。ですから、これを読んでいる間は穏やかになってください:)。

ViewPagerについて2つの質問があります。

初め:

フラグメントのリストをPagerAdapterに渡すと、リストの最初のフラグメントが表示されます。これを変更して、リストの2番目、3番目の...フラグメントを最初に表示できるようにすることはできますか?メソッドsetCurrentItem(page)は、PagerAdapterによって最初のフラグメントが表示された後にページを表示するためです。

2番:

次のように、動的なViewChangeの間に一時停止を実装しようとしました。

// pass the Fragments to pagerAdapter here which will show the first fragment

// loop for the other Fragments
handler.postDelayed(new Runnable(){
    public void run(){
       for(int i = 0; i < list.size(); i++){
            ViewPager.setCurrentItem(list.indexOf(i), true);
            // Set Pause here
       }
    }
}, 500);

「ここで一時停止を設定」というコメントは、ページングの間にまだ一時停止しようとしている場所を示しています。しかし、私はこれを解決する方法がわかりません。Thread.sleepはここでは本物ではないからです。

アイデアは、PageAdapterで最初のフラグメントを表示することでした。次に、handler.postDelayedを使用して、2番目のページのスワイプを遅らせます。そしてこれでは、私は一定の遅延ですべてのページをループしています。

誰かが私がこれらの解決策を見つけるのを手伝ってくれるなら、私は本当に幸せです。

4

2 に答える 2

2

最初の質問ですが、お電話setCurrentItem(int, false)ですか?setCurrentItem(int) を呼び出すだけの場合、ViewPager は、現在のアダプターで最初のレイアウトを既に通過している場合、遷移をアニメーション化します。それが解決策でない場合は、レイアウト ファイルで を初期化することを検討してください (または、フラグメント リストを に渡す前に を呼び出しViewPagerます) 。次に、 を呼び出した後、 を使用して ViewPager を可視に戻すことができます。onCreate で ViewPager を設定して呼び出すと、アニメーションが表示されなくなると思いますが、今はテストする時間がありません。visibility = "invisible"setVisibility(View.INVISIBLE)PagerAdaptersetCurrentItemsetVisibility(View.VISIBLE)setCurrentItem(int, false)

2番目の問題については、runメソッドが実行中にUIスレッド全体をブロックしようとしていることがあなたをつまずかせていると思います。つまり、アイテムをループしている間、UIはそれ自体を更新できません。でViewPager

本質的Thread.sleep()に、UI スレッドで呼び出しています。Runnable の run メソッド内にあるため、完全に明確ではない可能性があります。ただし、Handler のスレッドで実行するメッセージを投稿したことに気付かない限り、デフォルトの Handler( ) コンストラクター。代わりに、投稿された Runnable に新しいメッセージを postDelayed して、次に ViewPager の現在のアイテムを変更する必要があります。

私がすることは次のようなものです(注意-これはテストしていません):

継続的にループするメソッドを追加するためのサブクラスHandler(ViewPager を保持する Activity の内部クラスとしてこれを行っていると想定しているため、ViewPager を含むメンバー変数にアクセスできます。コードでそのメンバー変数 mPager を呼び出しています。下):

private Runnable mLoopingRunnable = new Runnable(){
    public void run() {
        int currentItem = mPager.getCurrentItem();
        int totalItems = mPager.getAdapter().getCount();
        int nextItem = (currentItem + 1) % totalItems;
        mPager.setCurrentItem(nextItem, true);
                handler.postDelayed(self, 500);
            }
        };

handler.postDelayed(mLoopingRunnable, 500);

ループを停止する場合 (ある時点でキャンセルする場合は、Runnable へのハンドルを保持する必要があることに注意してください):

handler.removeCallbacks(mLoopingRunnable);

上記のように呼び出しを変更する利点の 1 つsetCurrentItemは、ユーザーが ViewPager をスワイプしてあるビューから次のビューに移動するのを妨げないことです。ループで行ったように currentItem を整数に設定すると、ユーザーがページャーを操作したときに動作が多少奇妙に見えます。

ViewFlipper と同様に、ループを自動的に処理する何かがあると推測していましたが、ViewPager API をざっと見ただけでは、それがあることはすぐにはわかりません。

于 2012-07-09T15:43:26.590 に答える
0

UIスレッドをスリープ状態で停止しないでください。その間、アプリ内の何かと対話できるようにしたいので、必要に応じて、最初の遅延のような別の遅延を投稿できます...またはチェーンされたAsynctask...

私がお勧めするのは、フラグメントまたはビューを保持し、それらの間を反復し、xml を使用していくつかのトランジションを追加できるViewFlipperを使用することです。非常にシンプルでうまく機能します。

viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,
            R.anim.push_from_right_in));
// this animations are XML in res-> anim folder
viewFlipper.showPrevious(); // go to the next fragment in order

新しいアニメーションごとに遅延を設定できます....

viewFlipper.startFlipping();

また、アニメーション間の時間など、xml から多くのことを設定することもできます。

<ViewFlipper
    android:id="@+id/signup_layout_viewFlipper"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/headerFragment"
    android:flipInterval="1111" >

ビューをプッシュするアニメーション:

<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:duration="300"
android:fromXDelta="100%"
android:fromYDelta="0%"
android:toXDelta="0%"
android:toYDelta="0%" />

それが役立つことを願っています:)

よろしく

于 2012-07-09T13:47:59.417 に答える