ViewPager Fragment OncreateView根据切换的标签数多次调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ViewPager Fragment OncreateView根据切换的标签数多次调用相关的知识,希望对你有一定的参考价值。

我在下面的代码遇到问题,我的应用程序中有5个选项卡,当我尝试切换它们时,我只是注意到onCreateView被多次调用。现在我首先看到了关于类似问题的多篇文章,其中多次onCreateView被调用,但我的点亮有点不同,在我的应用程序onCreateView基于我正在切换的标签数被调用。例如,如果我是DOWNLOAD选项卡并且我切换到FAVORITE,onCreateView将被调用3次。如果我从设置中执行相同的操作,它将被调用4次。 CANDIDATE和其他标签也会发生同样的事情。

类似帖子 -

1 - OnCreateView called multiple times / Working with ActionBar and Fragments

2 - Android fragment OnCreateView called twice

enter image description here

public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
private Boolean exit = false;
private static final int REQUEST = 112;
private Context mContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
    setSupportActionBar(toolbar);
    mTitle.setText(toolbar.getTitle());
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);
    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    mContext = MainActivity.this;
    setupTabIcons();

}
@Override
protected void onResume()
{
    super.onResume();

}
private void setupTabIcons() {
    tabLayout.getTabAt(0).setIcon(getResources().getDrawable(R.drawable.settings));
    tabLayout.getTabAt(1).setIcon(getResources().getDrawable(R.drawable.download));
    tabLayout.getTabAt(2).setIcon(getResources().getDrawable(R.drawable.register));
    tabLayout.getTabAt(3).setIcon(getResources().getDrawable(R.drawable.profile));
    tabLayout.getTabAt(4).setIcon(getResources().getDrawable(R.drawable.favwhite));





}
private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new SettingsFragment(), getResources().getString(R.string.settings_tab));
    adapter.addFragment(new DownloadFragment(), getResources().getString(R.string.download_tab));
    adapter.addFragment(new RegisterFragment(), getResources().getString(R.string.register_tab));
    adapter.addFragment(new ProfileFragment(), getResources().getString(R.string.profile_tab));
    adapter.addFragment(new ProfileFragment(), getResources().getString(R.string.favorites_tab));
    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(0);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

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

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

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

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}
}

更新 - 要在运行4次时添加更多数据,屏幕上的数据是4次,这是重复的。 Fragement代码 -

public class RegisterFragment extends Fragment{

    public RegisterFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        return inflater.inflate(R.layout.fragment_register, container, false);
    }
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            getFragmentManager().beginTransaction().detach(this).attach(this).commit();
        }
    }

}

以上是关于ViewPager Fragment OncreateView根据切换的标签数多次调用的主要内容,如果未能解决你的问题,请参考以下文章

在 ViewPager 中用另一个 Fragment 替换一个 Fragment

ViewPager2+Fragment操作笔记

ViewPager2+Fragment操作笔记

ViewPager2+Fragment操作笔记

ViewPager2+Fragment操作笔记

Android 联合ViewPager 与 Fragment