简体   繁体   English

应用程序启动时如何创建所有片段

[英]How to create all fragments when application start

I am creating number of fragments programmatically. 我正在以编程方式创建许多片段。 All of them have different layouts and active fragment's layout is changed after swapping between fragments. 它们都具有不同的布局,并且在片段之间交换后,活动片段的布局会更改。

When program is started FragmentPagerAdapter creates first two fragment. 程序启动时, FragmentPagerAdapter创建前两个片段。 If I select last fragment (for example first one to seventh one) FragmentPagerAdapter starts to create seventh fargment and then sixth fragment. 如果选择最后一个片段(例如第一个FragmentPagerAdapter至第七个FragmentPagerAdapter ), FragmentPagerAdapter开始创建第七个片段,然后创建第六个片段。 At this point I want to select the current fragment using code below. 此时,我想使用下面的代码选择当前片段。

`(FragmentMasaDesign) getSupportFragmentManager().getFragments().get
                                (myViewPager.getCurrentItem());`

myViewPager.getCurrentItem() returns 6. That is true because I have select 7th fragment and its index is 6. However I have only four fragments that are created these are 1st-2nd-6th-7th. myViewPager.getCurrentItem()返回6。这是正确的,因为我选择了第7个片段,其索引为6。但是,只有四个片段被创建,分别是1st-2nd-6th-7th。 Thus getFragments() method returns me these four fargments and it can't select the current active fragment because of the value that is returned by myViewPager.getCurrentItem() 因此, getFragments()方法向我返回了这四个分支,由于myViewPager.getCurrentItem()返回的值,它无法选择当前活动片段。

Is there any way to create all fragments at start of the appliction or how can I get the current fragment before other fragments created? 有什么方法可以在应用开始时创建所有片段,或者如何在创建其他片段之前获取当前片段?

您可以使用offscreenpagelimit在viewpager上设置片段数。

viewpager.offscreenpagelimit(6);
public class CollectionPagerAdapter extends FragmentPagerAdapter {
    public ArrayList<Departman> lstDepartmanlar;
    public ArrayList<MasaDizayn> lstMasaDizayn;
    ArrayList<String> masaIsimleri;
    public String[] masaPlanIsmi;
    Fragment fragment;
    public Fragment[] fragments = null;

    public static FragmentMasaDesign newInstance(ArrayList<String> masalar, String DepartmanAdi) {
        FragmentMasaDesign myFragment = new FragmentMasaDesign();
        Bundle args = new Bundle();
        args.putStringArrayList("masalar", masalar);
        args.putString("departmanAdi", DepartmanAdi);
        myFragment.setArguments(args);
        return myFragment;
    }

    public CollectionPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        fragment = null;
        if (fragments == null)
            fragments = new Fragment[lstDepartmanlar.size()];
        for (int j = 0; j < lstDepartmanlar.size(); j++) {
            if (i == j) {
                for (Departman departman : lstDepartmanlar) {
                    if (departman.DepartmanEkrani.contentEquals(masaPlanIsmi[i])) {
                        masaIsimleri = new ArrayList<String>();
                        for (MasaDizayn masaDizayn : lstMasaDizayn) {
                            if (masaDizayn.MasaPlanAdi.contentEquals(departman.DepartmanEkrani)) {
                                masaIsimleri.add(masaDizayn.MasaAdi);
                            }
                        }
                    }
                }
                fragment = newInstance(masaIsimleri, lstDepartmanlar.get(i).DepartmanAdi);
            }
        }
        fragments[i] = fragment;
        return fragment;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return "OBJECT " + (position + 1);
    }
}

I have created a public fragment array and then stored the created fragment in this array then I have called the current fragment from this array like: 我创建了一个公共片段数组,然后将创建的片段存储在该数组中,然后从该数组调用了当前片段,例如:

   public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        mViewPager.setCurrentItem(tab.getPosition());
        fragment = collectionPagerAdapter.fragments[mViewPager.getCurrentItem()];
    }

Also it is possible to find the visible fragment on screen. 也可以在屏幕上找到可见的片段。 I will share its code later. 稍后我将分享其代码。

Thanks to all who spend time for my quesntion. 感谢所有花费我时间的人。

You could do replace one fragment by another fragment like the following 您可以将一个片段替换为另一个片段,如下所示

DiplayFragment newFragment = new DiplayFragment();

                                    FragmentTransaction transaction = getSupportFragmentManager()
                                            .beginTransaction();
                                    transaction
                                            .replace(R.id.nav_fl_frag_container, newFragment);
                                    transaction.addToBackStack(null);
                                    transaction.commit();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM