Доступ к фрагменту viewpager из активности - PullRequest
1 голос
/ 28 апреля 2019

У меня есть tabLayout в моей деятельности.При щелчке по вкладкам отображается viewpager, который содержит фрагмент.Я пытаюсь получить ссылку на фрагмент ViewPager, но я получаю null pointer каждый раз.Как получить экземпляр фрагмента viewPager из действия?

Первый метод: Fragment fragment = new Fragment();

Второй метод: Fragment fragment = (Fragment) viewPager.getAdapter().instantiateItem(viewPager, viewPager.getCurrentItem());

ViewPagerAdapter.java

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private int no_of_tabs;
    public ViewPagerAdapter(FragmentManager fm, int no_of_tabs) {
        super(fm);
        this.no_of_tabs = no_of_tabs;
    }

    @Override
    public Fragment getItem(int position) {
        return new Fragment();

    }

    @Override
    public int getCount() {
        return no_of_tabs;
    }

}

MainActivity.java

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        firebaseFirestore = FirebaseFirestore.getInstance();
        final ViewPager viewPager = findViewById(R.id.viewPager);
        final TabLayout tabLayout = findViewById(R.id.tabLayout);
        firebaseFirestore.collection("Categories")
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                Log.d(TAG, document.getString("title") + " => " + document.getData());
                                tabLayout.addTab(tabLayout.newTab().setText(document.getString("title")));
                                tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
                                final PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
                                fragment = (Fragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.viewPager + ":" + viewPager.getCurrentItem());
                                viewPager.setOffscreenPageLimit(4);
                                fragment.setTextViewText();
                                viewPager.setAdapter(categoriesPagerAdapter);
                            }
                        } else {
                            Log.d(TAG, "Error getting documents: ", task.getException());
                        }
                    }
                });

        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());


            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }

}

1 Ответ

0 голосов
/ 28 апреля 2019

Сделайте это следующим образом

      Fragment page = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.viewpager + ":" + viewPager.getCurrentItem());

Замените R.id.viewpager своим идентификатором ViewPager

Вы не можете использовать этот код внутри метода onCreate, поскольку пользовательский интерфейс фрагментов еще не создан.

В этом случае вы можете сделать это

viewPager.setOffscreenPageLimit(4); // this forces to load 4 

setOffscreenPageLimit используется, чтобы заставить адаптер создать еще 4 страницы после создания первой.Значение по умолчанию - 1. Это полезно только для доступа к невыбранной странице.

Если вам нужно обновить пользовательский интерфейс фрагментов во время создания страницы, вы можете использовать это в onCreate ...

    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(x);    
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i1) {
            // here you can set you UI values from page 'i'.
            // i = page index 
        }

        @Override
        public void onPageSelected(int i) {
            // here you can set you UI values from the selected page
            // i = page index 
            // for the first selected page (before scrolling), use onPageScrolled
        }

        @Override
        public void onPageScrollStateChanged(int i) {
        }
    });

При первом показе фрагмента viewpager onPageSelected не запускается, а onPageScrolled.Таким образом, вы можете поиграть с этими двумя способами, чтобы обновить ваш фрагментный интерфейс.

...