Заголовок ViewPager не появится, пока я не проведу

Я учусь использовать 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>

Это скриншот "Просто нажал значок приложения": введите описание изображения здесь

И это после того, как я пролистал до второй страницы: введите описание изображения здесь

Я действительно расстроен. Спасибо!!

4 ответа

Решение

Эта проблема появилась в 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 внутри onResume() Activity

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

Новое обновление: как упомянуто в приведенной выше ссылке отслеживания проблем Google и комментариях от JP Ventura. Я попытался с новой версией библиотеки, и проблема, кажется, исправлена.

Вместо использования android.support.v4.view.PagerTabStrip используйте android.support.design.widget.TabLayout для отображения вкладок для viewPager. Он включен в библиотеку поддержки дизайна Google.

Смотрите эту ссылку для получения дополнительной информации 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);
}

Попробуй это. Кажется, это работает для меня.

@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 устанавливает пейджер в 1, а затем обратно в 0. Это заставляет заголовок появляться, что страница загружается в первый раз.

Я также недавно начал испытывать эту проблему, и после небольшого тестирования я думаю, что нашел ошибку в последнем обновлении пакета поддержки Android.

Проблема появляется в com.android.support:appcompat-v7:23.0.0.

Попробуйте изменить зависимость обратно на com.android.support:appcompat-v7:22.2.1 (второе последнее обновление) и посмотрите, работает ли это.

К сожалению, мне еще не удалось найти какое-либо решение, чтобы оно работало с последним обновлением пакета поддержки.

Другие вопросы по тегам