下面的代码有问题,我的应用程序中有5个选项卡,当我试图切换这些选项卡时,我注意到oncreateview被多次调用。首先,我看到了关于类似问题的多篇文章,其中调用了多次oncreateview,但我的有所不同,在我的应用程序中,oncreateview是根据我切换的选项卡数量调用的。例如,如果我是“下载”选项卡并切换到“收藏夹”,则将调用OnCreateView 3次。如果我从设置中执行相同的操作,将调用4次。同样的事情发生在候选人和其他标签上。
类似职位-
1-OnCreateView called multiple times / Working with ActionBar and Fragments
2-Android fragment OnCreateView called twice
android - ViewPager fragment OncreateView基于切换的选项卡数被多次调用-LMLPHP

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次。
碎片代码-
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();
        }
    }

}

最佳答案

默认情况下,视图寻呼机按以下顺序加载片段。
当前选定的位置片段。可见的
缓存(选定位置-1)片段(如果有)。不可见
缓存(选定位置+1)片段(如果有)。不可见
原因是,为了使动画从一个片段平滑到另一个片段而不滞后,view pager缓存上一个片段和下一个片段。要确认此日志,请在视图寻呼机适配器中的getitem()方法中确定位置。
因此。启动活动时,您的viewpager正在加载位置0和1。IE加载2个片段。在-1位置没有碎片。

关于android - ViewPager fragment OncreateView基于切换的选项卡数被多次调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47899881/

10-10 20:05