Ссылаясь на невидимые фрагменты в ViewPager - PullRequest
4 голосов
/ 31 декабря 2011

Я использую 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;
        }
    }
}

Ответы [ 4 ]

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

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

mViewPager.setOffscreenPageLimit(2);

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

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

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

0 голосов
/ 15 сентября 2014

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

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

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

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

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

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

...