1

ViewPager を使用して FragmentActivity を作成しました。タブにアクションバーを使用したくなかったため (タブをメニューの上に配置したくないため)、PagerTabStrip ソリューションも使用しませんでした。 .

だから私はタブコンテナとして独自のlinearlayoutを書きました:

<LinearLayout
    android:id="@+id/main_tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:orientation="horizontal" >
</LinearLayout>

各タブごとに View.OnClickListener を使用

OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(final View view) {
            mapTabs.get(lastSelectedTab).setSelected(false);
            view.setSelected(true);

            Runnable runnable = new Runnable() {                    
                @Override
                public void run() {
                    int index = Integer.parseInt(view.getTag().toString());
                    FragmentActivity.setTab(index);
                    lastSelectedTab = index;
                }
            };
            handler.post(runnable);                 
        }
    };
}



public static void setTab(int index) {      
    FragmentActivity.viewPager.setCurrentItem(index, true); // true or false does not make any difference
}

これは、単一のタブをタブ コンテナー (main_tabs) に追加するために作成したメソッドです。

private void addTab(LayoutInflater inflater, ViewGroup tabs, int imageId, View.OnClickListener onClickListener) {
    inflater.inflate(R.layout.main_tab, tabs);
    int index = tabs.getChildCount() - 1;
    ImageView ivTab = (ImageView) tabs.getChildAt(index);
    ivTab.setTag(String.valueOf(index)); // stored the tab index
    ivTab.setImageResource(imageId); 
    ivTab.setOnClickListener(onClickListener);
    mapTabs.put(index, ivTab); // add an imageview to the tab
}

新しいページが表示されたときのわずかな遅延の後ではなく、すぐにタブの強調表示が表示されるように、runnalbe を使用しました。新しいタブが選択されたときに選択を解除するために、最後に選択したタブも保存しました。

後で選択できるように、すべてのタブをマップに保存します。

これは私が書いたOnPageChangeListenerです(関連するタブを強調表示するため):

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {              
            mapTabs.get(position).setSelected(true); // selected the tag asociated with the current visible page
            mapTabs.get(lastSelectedTab).setSelected(false); // deselectes the last selected tab
            lastSelectedTab = position;
            ListFragment<?> item = FragmentActivity.fragmentAdapter.getItem(position);
            setTitle(item.getTitle());          
        }

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

すべてが正常に動作しますが、パフォーマンスについては明確ではありません:

次のページにスクロールすると、すべてが非常に速くスムーズに進みます。次のページは取引なしですぐに表示されます。アクション バーのメニュー (各 Fragment の onCreateOptionsMenu(Menu menu, MenuInflater inflater) メソッドで作成) のみがわずかな遅延 (約 500 ~ 700 ミリ秒) で表示されます。

しかし、タブの1つをクリックすると、選択したページがすぐには表示されませんが、少し遅れて表示されます(実際には、上記のようにメニューが表示される必要があります:メニューとページが同時に表示されます)。bzw。これは、タブストリップ ソリューションを使用するときにも発生します。

スクロールによって遅延のないページ変更を実現できれば、タブクリックで同じパフォーマンスを実現できるはずです。

しかし、私は何を間違っていますか?スクロール時にページと同じようにメニューをすぐに表示する可能性はありますか? ページと同じように、さまざまなメニューをキャッシュできませんか?

4

3 に答える 3

8

解決策は非常に簡単でした。4 つのタブをすべて ViewPager に保持して、再作成する必要がないようにする必要がありました (したがって、タブをクリックするたびに短い遅延が発生することはありません)。onCreate メソッドに次の行を追加するだけでした。

viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setOffscreenPageLimit(4); 
于 2014-01-07T13:35:12.367 に答える
0

これを試して

myViewPager.animate().translationX(0f).setDuration(1000);

ここで、1000 はミリ秒単位の遅延です

于 2013-10-11T10:55:22.950 に答える