我用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) {
}
});
一切正常,我只是不清楚表现:
当我滚动到下一页时,一切都变得非常快速和流畅。下一页立即出现,没有任何dealy;只有动作栏中的菜单(在每个片段的onCreateOptionsMenu(菜单菜单,MenuInflater inflater)方法中创建)出现稍有延迟(约500-700毫秒)。
但是当我点击其中一个标签时,所选页面不会立即显示,但会有轻微的延迟(实际上,如上所述,菜单需要同时显示:菜单和页面同时显示在一起)。 bzw.当我使用tabstrip解决方案时也会发生这种情况。
我猜如果通过滚动可以实现无延迟的页面更改,应该可以以某种方式实现选项卡点击的相同性能。
但我做错了什么? 并且有可能使菜单立即像滚动时的页面一样出现吗?可以像页面一样缓存不同的菜单吗?
答案 0 :(得分:7)
解决方案非常简单。我只需要将所有4个选项卡保留在ViewPager中,这样就不需要重新创建它们(因此在每个tab-clicki之后不会导致短暂的延迟)。我只需要在onCreate方法中添加以下行。
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setOffscreenPageLimit(4);
答案 1 :(得分:1)
以避免标签之间的延迟单击视图中的寻呼机应设置标签的限制,如
pager.setOffscreenPageLimit(4);
答案 2 :(得分:0)
试试这个
myViewPager.animate().translationX(0f).setDuration(1000);
其中1000是以毫秒为单位的延迟