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

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

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

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

ric*_*ard 8

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

viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setOffscreenPageLimit(4); 
Run Code Online (Sandbox Code Playgroud)