ViewPager + FragmentStatePagerAdapter: ViewPager перестает работать при изменении ориентации экрана - PullRequest
5 голосов
/ 18 февраля 2012

Я использую ActionBarSherlock (который в основном является расширением пакета поддержки Android).

Я пытаюсь сделать следующее:

У меня есть FragmentActivity, которыйхосты только один ViewPager.У этого ViewPager есть FragmentStatePagerAdapter (потому что в будущем будет много предметов).Но на данный момент в него загружено 2 элемента для тестирования.

Все работает отлично, пока я в портретной ориентации.Но когда я меняю альбомную ориентацию, он переключается обратно на первый элемент в адаптере (что нормально, поскольку все перезагружается и т. Д.), Но я не могу перейти к следующему элементу.Ничего не происходит.

Из отладки я вижу, что Loader прекрасно возвращает два элемента.getItem(...) также вызывается с position 0 и 1. Таким образом, в принципе все выглядит хорошо, за исключением того, что это не так;)

Кстати: то же самое происходит наоборот, когда я начинаю в альбомной ориентации и переключаюв портретную ориентацию.

Есть идеи, что здесь может быть не так?

Вот мой код:

public class QuotesStatePagerAdapter extends FragmentStatePagerAdapter {

private List<Quote> mQuotes;

public QuotesStatePagerAdapter(FragmentManager fm, List<Quote> quotes) {
    super(fm);
    mQuotes = quotes;
}

@Override
public Fragment getItem(int position) {
    Bundle arguments = new Bundle();
    arguments.putSerializable("quote", mQuotes.get(position));
    QuoteFragment fragment = new QuoteFragment();
    fragment.setArguments(arguments);
    return fragment;
}

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

}

public QuotesFragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

public void updateOrdering(ORDERING newOrdering) {
    mOrdering = newOrdering;
    getLoaderManager().getLoader(0).startLoading();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.quotes, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
    mViewPager.setOnPageChangeListener(this);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    getLoaderManager().initLoader(0, null, this);
}

@Override
public Loader<List<Quote>> onCreateLoader(int id, Bundle args) {
    return new QuotesLoader(getActivity(), mCategoryId);
}

@Override
public void onLoadFinished(Loader<List<Quote>> loader, List<Quote> data) {
    mQuotes = data;
    mViewPager.setAdapter(new QuotesStatePagerAdapter(
            getSupportFragmentManager(), mQuotes));
}

Ответы [ 2 ]

12 голосов
/ 23 февраля 2012

android: configChanges = "direction" работал как шарм, но я видел, что это не рекомендуется командой android (только последний случай) ... Смотрите здесь http://developer.android.com/guide/topics/manifest/activity-element.html#config

Я обнаружил, что установка: setRetainInstance (true);на onCreateView каждого сохраненного фрагмента сделайте свое дело.(пожалуйста, обратите внимание, что onActivityCreated будет вызываться снова)

0 голосов
/ 18 февраля 2012

Попробуйте добавить android:configChanges="orientation" к манифесту внутри тега Activity

...