ric*_*ard 1 android android-viewpager android-tabs
我用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>
Run Code Online (Sandbox Code Playgroud)
每个选项卡都有一个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
}
Run Code Online (Sandbox Code Playgroud)
这是我编写的方法将单个选项卡添加到选项卡容器(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
}
Run Code Online (Sandbox Code Playgroud)
我使用了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) {
}
});
Run Code Online (Sandbox Code Playgroud)
一切正常,我只是不清楚性能:
当我滚动到下一页时,一切都变得非常快速和平稳.下一页立即出现,没有任何dealy; 只有动作栏中的菜单(在每个片段的onCreateOptionsMenu(菜单菜单,MenuInflater inflater)方法中创建)出现稍有延迟(约500-700毫秒).
但是当我单击其中一个选项卡时,所选页面不会立即显示,但会略有延迟(实际上,如上所述,菜单需要同时显示:菜单和页面同时显示在一起).bzw. 当我使用tabstrip解决方案时也会发生这种情况.
我猜如果通过滚动可以实现无延迟页面更改,应该可以以某种方式实现选项卡点击的相同性能.
但是我做错了什么?并且有可能使菜单立即像滚动时的页面一样出现吗?可以像页面一样缓存不同的菜单吗?
解决方案非常简单.我只需要将所有4个选项卡保留在ViewPager中,这样就不需要重新创建它们(因此在每个tab-clicki之后不会导致短暂的延迟).我只需要在onCreate方法中添加以下行.
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setOffscreenPageLimit(4);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2598 次 |
| 最近记录: |