【问题标题】:Fragment onCreateView getting called multiple time so that new instance of fragment is created every time片段 onCreateView 被多次调用,以便每次都创建片段的新实例
【发布时间】:2019-09-12 04:54:29
【问题描述】:

我正在尝试在视图寻呼机的页面更改上添加片段。但是每次我滚动视图寻呼机时,都会创建新的片段瞬间。

public void initializeViewPager(int currentPage, String selectedCardNumber) {
    currentPosition = currentPage;
    FragmentPagerAdapter journeyViewPagerAdapter =
            new ViewPagerAdapter(getSupportFragmentManager());


    ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            //Default Implementation
        }

        @Override
        public void onPageSelected(int position) {
            currentPosition = position;
            addFragments(position, selectedCardNumber);
            handleScrollState();
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            //Default Implementation
        }
    };

    viewPager.addOnPageChangeListener(onPageChangeListener);
    initCarousalAdapter();

}

addFragments() 方法

private void addFragments(int position, final String selectedCardNumber) {

    FragmentTransaction fragTransaction = getSupportFragmentManager().beginTransaction();
    Bundle bundle = new Bundle();
    bundle.putInt(ApplicationConstants.SELECTED__TYPE, position);
    bundle.putString(DataConstants.SELECTED__NUMBER, selectedCardNumber);

    switch (position) {
        case 1:
            OffersFragmentOne fragment = OffersFragmentOne.getInstance();
            fragment.setArguments(bundle);
            fragTransaction.replace(R.id.btmt_fragment_container, fragment);
            break;

        case 2:
            OffersFragmentTwo mtFragment = OffersFragmentTwo.getInstance();
            mtFragment.setArguments(bundle);
            fragTransaction.replace(R.id.btmt_fragment_container, mtFragment);
            break;

        case 3:
            OffersFragmentThree poFragment = OffersFragmentThree.getInstance();
            poFragment.setArguments(bundle);
            fragTransaction.replace(R.id.btmt_fragment_container, poFragment);
            break;
        default:
            //Default Implementation
    }

    fragTransaction.commit();
}

getInstance() 方法

private static OffersFragmentOne offersFragmentOne;

public static OffersFragmentOne getInstance() {
    if (OffersFragmentOne == null) {
        offersFragmentOne = new OffersFragmentOne();
    }
    return offersFragmentOne;
}

ViewPagerAdapter.java

public class ViewPagerAdapter extends FragmentPagerAdapter {

private final int[] carousalImages = {R.drawable.ic_po_carousal_banner, 
R.drawable.ic_bt_carousal_banner,
    R.drawable.ic_mt_carousal_banner, R.drawable.ic_po_carousal_banner, 
R.drawable.ic_bt_carousal_banner};

public ViewPagerAdapter(FragmentManager fragmentManager) {
    super(fragmentManager);
}

@Override
public Fragment getItem(int position) {
    CarousalFragment frag = new CarousalFragment();
    CarousalFragmentPresenter.createAndAttach(frag, carousalImages[position]);
    return frag;
}

@Override
public int getCount() {
    return carousalImages != null ? carousalImages.length : 0;
}
}

【问题讨论】:

  • 您在addFragments() 中创建新实例,每次都必须在活动或适配器中创建一个保留实例并一次又一次地重复使用它
  • 我使用的是静态的 getInstance() 方法,并且只创建一次片段实例。还是有其他方法@Hanzala
  • 能分享一下getInstance方法的代码吗?
  • 分享ViewPagerAdapter代码
  • 我注意到您没有为视图寻呼机使用任何适配器,而是在 addFragments() 方法中手动替换片段

标签: android android-fragments android-viewpager android-viewpager2 fragment-oncreateview


【解决方案1】:

您应该在getItem 中编写您的switch case,并且不需要bundle 和片段事务,因为getItem 本身返回选定的Fragment 并将与ViewPager 绑定

@Override
public Fragment getItem(int position) {
switch (position) {
    case 0:
        CarousalFragment();
        break;
    case 1:
        OffersFragmentOne.getInstance();
        break;

    case 2:
        OffersFragmentTwo.getInstance();

        break;

    case 3:
        OffersFragmentThree.getInstance();
        break;
    default:
        //Default Implementation
}
}

OnPageChangeListener 只是给你选择和滚动的项目或片段的位置,所以不需要从onPageSelected 添加片段

ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        //Default Implementation
    }

    @Override
    public void onPageSelected(int position) {

    }

    @Override
    public void onPageScrollStateChanged(int state) {
        //Default Implementation
    }
};

【讨论】:

  • 你找到解决办法了吗?
【解决方案2】:

如何在视图寻呼机的容器活动中创建片段实例?这样,它们应该仅在创建容器时创建。

编辑:添加示例代码。 示例:

public class ContainerActivity extends AppCompatActivity {
    private FragmentOne fragmentOne;
    private FragmentTwo fragmentTwo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.container_with_view_pager);
        fragmentOne = FragmentOne.getInstance();
        fragmentTwo = FragmentTwo.getInstance();

        ViewPager viewPager = findViewById(R.id.viewpager);
        setupViewPager(viewPager);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(fragmentOne, "Fragment One");
        adapter.addFragment(fragmentTwo, "Fragment Two");
        viewPager.setAdapter(adapter);
    }
}

【讨论】:

  • 你有这方面的例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
相关资源
最近更新 更多