【问题标题】:ViewPager Fragement OncreateView called multiple times based on number of tabs switchedViewPager Fragment OncreateView 根据切换的选项卡数多次调用
【发布时间】:2017-12-20 06:20:22
【问题描述】:

我在使用以下代码时遇到问题,我的应用程序中有 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

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();
        }
    }

}

【问题讨论】:

  • 删除viewPager.setOffscreenPageLimit(0);后尝试相同或不同的结果默认为1。
  • @ADM 即使在我删除它之后也是相同的行为,我在阅读其他用户问题后补充说,但这对我没有帮助。

标签: android android-fragments android-viewpager android-tablayout


【解决方案1】:

默认情况下,视图分页器按以下顺序加载片段。

  1. 当前选择的位置片段。可见
  2. 缓存(选定位置 - 1)片段,如果有的话。不可见
  3. (选定位置 + 1)片段的缓存(如果有)。不可见

这样做的原因是,为了使从一个片段到另一个片段的平滑动画没有滞后,视图分页器缓存了前一个片段和下一个片段。要确认此日志,请在视图分页适配器中的 getItem() 方法中记录位置。

由于上述原因。启动活动时,您的 viewpager 正在加载位置 0 和 1。即加载 2 个片段。 -1 位置没有片段。

【讨论】:

  • 谢谢@Anbarasu Chinna,你能分享一个例子吗?我不清楚它会有什么帮助,这是我第一次使用 viewpage 适配器。
  • 忘了提及我在 getItem 中尝试了以下选项,但这也无济于事。切换案例 0:DownloadFragment tab1 = new DownloadFragment();返回 tab1;
  • 你能用你的片段发布或更新你的问题吗
  • 我已经为一个类添加了我的片段部分,同样我还有 3 个标签,它们在加载后会做一些活动。
  • @AnbarasuChinna 如果我有 3 个选项卡和一个 Fragment 并在 3 个选项卡中加载此片段。在每一次都给我不同的结果。那么如何才能捕捉到片段的第一次调用和第二次调用呢?
猜你喜欢
  • 2012-02-12
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多