1

我用 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 解决方案时也会发生这种情况。

我想如果它可以通过滚动来实现无延迟的页面更改,那么应该有可能以某种方式实现标签点击的相同性能。

但我做错了什么?是否有可能让菜单在滚动时像页面一样立即出现?不同的菜单不能像页面一样被缓存吗?

4

3 回答 3

8

解决方案非常简单。我只需将所有 4 个选项卡保留在 ViewPager 中,这样它们就不需要重新创建(因此不会在每次单击选项卡后造成短暂的延迟)。我只需要在 onCreate 方法中添加以下几行。

viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setOffscreenPageLimit(4); 
于 2014-01-07T13:35:12.367 回答
1

为避免选项卡之间的延迟单击视图寻呼机应设置选项卡的限制,例如

pager.setOffscreenPageLimit(4);

于 2015-11-03T12:23:59.967 回答
0

尝试这个

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

其中 1000 是以毫秒为单位的延迟

于 2013-10-11T10:55:22.950 回答