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。これは、タブストリップ ソリューションを使用するときにも発生します。
スクロールによって遅延のないページ変更を実現できれば、タブクリックで同じパフォーマンスを実現できるはずです。
しかし、私は何を間違っていますか?スクロール時にページと同じようにメニューをすぐに表示する可能性はありますか? ページと同じように、さまざまなメニューをキャッシュできませんか?