ViewPager&选项卡:单击选项卡后延迟

时间:2013-10-11 10:28:29

标签: 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>

每个选项卡都有一个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解决方案时也会发生这种情况。

我猜如果通过滚动可以实现无延迟的页面更改,应该可以以某种方式实现选项卡点击的相同性能。

但我做错了什么? 并且有可能使菜单立即像滚动时的页面一样出现吗?可以像页面一样缓存不同的菜单吗?

3 个答案:

答案 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是以毫秒为单位的延迟