gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:30:00 27 4
gpt4 key购买 nike

我在使用以下代码时遇到问题,我的应用程序中有 5 个选项卡,当我尝试在它们之间切换时,我只是注意到 onCreateView 被调用了多次。现在,首先我确实看到了多篇关于类似问题的帖子,其中多次调用 onCreateView,但我的有点不同,在我的应用程序中,onCreateView 是根据我正在切换的选项卡数量调用的。例如,如果我在下载选项卡并切换到收藏夹,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 次,这是重复的。 fragment 代码-

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

}

最佳答案

默认情况下, View 寻呼机按以下顺序加载 fragment 。

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

这样做的原因是,为了使从一个 fragment 到另一个 fragment 的动画流畅而不滞后, View 分页器缓存了上一个和下一个 fragment 。要确认这一点,请记录 View 寻呼机适配器中 getItem() 方法中的位置。

作为上述的结果。启动 Activity 时,您的 viewpager 正在加载位置 0 和 1。即加载 2 fragment 。 -1位置没有 fragment 。

关于android - ViewPager Fragment OncreateView 根据切换的标签数量调用多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47899881/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com