簡體   English   中英

從活動訪問viewpager的片段

[英]Access viewpager's fragment from activity

我的活動中有一個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) {

            }
        });
    }

}

像這樣做

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

用您的viewpager id替換R.id.viewpager

您無法在onCreate方法中使用此代碼,因為尚未創建片段UI。

在這種情況下,您可以執行此操作

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

setOffscreenPageLimit用於強制適配器在創建第一個頁面后再創建4個頁面。 默認值為1。這僅對訪問未選擇的頁面有用。

如果需要在創建頁面時更新片段UI,則可以在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一樣。 因此,您可以使用這兩種方法來更新片段UI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM