ViewPager标题直到我滑动才会出现

12

我正在学习使用ViewPager和PagerTabStrip来实现导航栏。我已经实现了它,我的问题是:每次我打开应用程序时,标题都不会显示,但当我滑动一次后,所有标题都会再次出现,然后一切就正常了。 下面是代码:

自定义适配器

public class MyPagerAdapter extends PagerAdapter {
    private List<View> viewList;
    private List<String> titleList;

    public MyPagerAdapter(List<View> viewList, List<String> titleList){
        this.viewList = viewList;
        this.titleList = titleList;
    }

    @Override
    public int getCount() {
        return viewList.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object o) {
        return view == o;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(viewList.get(position));
        return viewList.get(position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(viewList.get(position));
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return titleList.get(position);
    }
}

.xml文件:

<android.support.v4.view.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center">

    <android.support.v4.view.PagerTabStrip
        android:id="@+id/tab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        />

</android.support.v4.view.ViewPager>

这是"Just clicked the app icon"的屏幕截图: 在此输入图片描述

接着,这是我向右滑动到第二页后的屏幕截图: 在此输入图片描述

我真的很沮丧。谢谢!!


没有,问题没解决,我相信应该把它放在ViewPager里面。 - TPWang
你在 onPageSelected 函数中设置了标题吗? - Jignesh Jain
我不认为我有一个 onPageSelected 函数... - TPWang
如果你正在使用fragment,尝试将你的适配器扩展为FragmentStatePagerAdapter而不是PagerAdapter。 - Jignesh Jain
这里有解决方案:https://dev59.com/E1wY5IYBdhLWcg3wpJL_ - toxa_xa
显示剩余4条评论
4个回答

13

这是一个在com.android.support:appcompat-v7:23.0.0中出现的问题。你可以在这里查看 https://code.google.com/p/android/issues/detail?id=183127

在那个链接中,Google支持团队提到该缺陷将在未来版本中修复。因此,现在的解决方案是使用com.android.support:appcompat-v7:22.2.1构建项目。

更新:如果可行的话,您可以尝试@nidheeshdas提供的另一种解决方案。我已经在简单的项目上尝试过了,它可以工作。@nidheeshdas的修改后的解决方案在Activity的onResume()方法中。

viewPager.setCurrentItem(1);
    viewPager.postDelayed(new Runnable() {
        @Override
        public void run() {
            viewPager.setCurrentItem(0);
        }
    },100);

最新更新: 正如上面Google问题跟踪器链接中提到的以及JP Ventura的评论所述,我已尝试使用新版本的库,问题似乎已经得到解决。


1
将依赖更新为“com.android.support:appcompat-v7:23.1.1”和构建工具版本更新为“23.0.2”也可以起到作用。 - JP Ventura

3

使用android.support.design.widget.TabLayout代替android.support.v4.view.PagerTabStrip显示viewPager的标签。它已包含在Google Design Support Library中。

请查看此链接获取更多信息: http://android-developers.blogspot.in/2015/05/android-design-support-library.html

仅需几行:

viewPager=(ViewPager)v.findViewById(R.id.viewPager);

ViewPagerAdapter adapter=new ViewPagerAdapter(this.getChildFragmentManager(),doctor);
adapter.setViewPagerFragmentListener(this);
viewPager.setAdapter(adapter);

tabLayout.setupWithViewPager(viewPager);  //Sync Tabs with viewPager
tabLayout.setTabsFromPagerAdapter(adapter);  //Setup tabs titles 

如果要更改标题,请在ViewPagerAdapter中使用以下代码:

@Override
public CharSequence getPageTitle(int position) {
    switch (position){
        case 0:
            return "Title 1";
        case 1:
            return "Title 2";
        case 2:
            return "Title 3";
    }
    return super.getPageTitle(position);
}

1
我最近也遇到了这个问题,经过一些测试后,我认为在Android的最新支持包更新中发现了一个bug。
问题似乎出现在com.android.support:appcompat-v7:23.0.0中。
尝试将依赖项更改回com.android.support:appcompat-v7:22.2.1(第二个最新更新)并查看是否可行。
不幸的是,我还没有找到任何解决方法可以与最新的支持包更新一起使用。

当我点击"添加依赖项"菜单和库依赖项时,甚至没有任何响应,它就是不回应。我将首先卸载Android Studio,然后重新安装它。 - TPWang

1

试试这个。对我来说似乎有效。

@Override
protected void onResume() {
    super.onResume();
    pager.setCurrentItem(1);
    Task.delay(500).continueWith(new Continuation<Void, Object>() {
        @Override
        public Object then(Task<Void> task) throws Exception {
            pager.setCurrentItem(0);
            return null;
        }
    }, Task.UI_THREAD_EXECUTOR);
}

在onResume中将pager设置为1,然后再设置为0。这会使标题在第一次加载页面时出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接