我用 ViewPager 写了一个 FragmentActivity,我不想为选项卡使用操作栏(因为我不希望选项卡位于菜单上),也不是 PagerTabStrip 解决方案,因为我无法按照我的意愿自定义它.
所以我写了一个自己的线性布局作为标签容器:
<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 毫秒)。
但是当我单击其中一个选项卡时,所选页面不会立即出现,而是稍有延迟(实际上,菜单需要同时出现,如上所述:菜单和页面同时出现)。bzw。当我使用 tabstrip 解决方案时也会发生这种情况。
我想如果它可以通过滚动来实现无延迟的页面更改,那么应该有可能以某种方式实现标签点击的相同性能。
但我做错了什么?是否有可能让菜单在滚动时像页面一样立即出现?不同的菜单不能像页面一样被缓存吗?