Обращение к невидимым фрагментам в ViewPager

Я использую ViewPager с 3 или более фрагментами, отображающими и сохраняющими CustomView в виде поля.

В процессе размещения FragmentActivity мне нужно получить доступ и установить атрибуты и поля CustomView, чтобы изменить способ их отображения.

Проблема возникает, когда мне нужно получить доступ к еще не созданному фрагменту, такому как третий фрагмент в начале действия (по умолчанию выбран первый фрагмент, и создается только следующий фрагмент).

Моя активность:

public class VectorProduct extends FragmentActivity {
    ViewPager mViewPager;
    TabsAdapter mTabsAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pager);

        final ActionBar bar = getSupportActionBar();
        bar.setSubtitle(R.string.bt_dashboard_vector_product);
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        mTabsAdapter = new TabsAdapter(this, bar, mViewPager);
        mTabsAdapter.addTab(bar.newTab().setText("Vector 1"), VectorFragment.class);
        mTabsAdapter.addTab(bar.newTab().setText("Vector 2"), VectorFragment.class);
        mTabsAdapter.addTab(bar.newTab().setText("Vector 3"), VectorFragment.class);
    }

    public static class TabsAdapter extends FragmentPagerAdapter implements
        ViewPager.OnPageChangeListener, ActionBar.TabListener {
        private final FragmentManager mFragmentManager;
        private final Context mContext;
        private final ActionBar mActionBar;
        private final ViewPager mViewPager;
        private ArrayList<Class<? extends Fragment>> Fragments;

        public TabsAdapter(FragmentActivity activity, ActionBar actionBar,
            ViewPager pager) {
            super(activity.getSupportFragmentManager());
            mFragmentManager = activity.getSupportFragmentManager();
            mContext = activity;
            mActionBar = actionBar;
            mViewPager = pager;
            mViewPager.setAdapter(this);
            mViewPager.setOnPageChangeListener(this);
            setFragments(new ArrayList<Class<? extends Fragment>>());
        }

        public void addTab(ActionBar.Tab tab, Class<? extends Fragment> clss) {
            mActionBar.addTab(tab.setTabListener(this));
            getFragments().add(clss);
            notifyDataSetChanged();
        }

        @Override
        public Fragment getItem(int position) {
            try {
                return Fragments.get(position).newInstance();
            } catch (InstantiationException e) {

            } catch (IllegalAccessException e) {

            }
            return null;
        }

        public Fragment findFragment(int position) {
            String name = "android:switcher:" + mViewPager.getId() + ":" + position;
            Fragment fragment = mFragmentManager.findFragmentByTag(name);
            if (fragment == null) {
                fragment = getItem(position);
            }
            return fragment;
        }
    }
}

person user1014917    schedule 30.12.2011    source источник


Ответы (4)


Если вы не возражаете против того, чтобы фрагменты для каждой страницы в ViewPager создавались постоянно, то я бы изменил ограничение внеэкранной страницы в вашем onCreateView после инициализации ViewPager:

mViewPager.setOffscreenPageLimit(2);

Сейчас поставил 2, так как у вас 3 вкладки. Было бы 3 для 4 вкладок и так далее и тому подобное. Документация из Android API: http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit%28int%29

Изменение внеэкранного лимита на количество вкладок минус 1 означает, что загружаются все соседние фрагменты для всех вкладок. По умолчанию это значение равно 1, поэтому загружались только ближайшие вкладки.

Имейте в виду, что эта функция была добавлена ​​совсем недавно (я думаю, поддержка package v4, выпуск 6), поэтому убедитесь, что ваш пакет поддержки обновлен.

person zilinx    schedule 23.02.2012

Попробуйте создать экземпляр фрагмента в методе onCreateView() отдельного класса Fragment вместо того, чтобы делать это здесь. См. http://android.codeandmagic.org/2011/08/android-dynamic-form-fragment/ для более подробной информации.

person user936414    schedule 21.02.2012

Проблема в том, что вы создаете фрагменты на лету (по мере необходимости), но логика вашего приложения предполагает, что фрагменты существуют все время (точнее, пока существует активность). Решение user936414 работает, потому что оно гарантирует, что фрагменты уже существуют после создания экземпляра действия.

Обратите внимание, что если вы хотите показать только (пакет) представлений, вы можете вообще не работать с фрагментами. Вы можете напрямую создавать экземпляры представлений в файле ViewPager. Это кажется особенно применимым, поскольку вы хотите получить доступ ко всему содержимому страницы в любое время. См. https://stackoverflow.com/a/8685189/243165 пример с полным кодом.

person Eric Kok    schedule 23.02.2012

Вы должны использовать вложенные фрагменты, чтобы встроить фрагмент в родительский фрагмент. Вызовите родительский фрагмент getChildFragmentManager() вместо getFragmentManager(), чтобы получить рабочий FragmentManager.

person Pelanes    schedule 15.09.2014