并非总是调用CreateView上的Viewpager片段1



当我在viewPager中滑动到或从其相邻的Fragments(0,2(中选择Fragment1(Fragment Numbers为0-3(时,不会调用其onCreateView或onCreate函数。

但是,当我从Fragment3向后滑动或在Fragment3处于活动状态时选择Fragment1时,这两个函数都会被调用。我很困惑为什么不从相邻的碎片中调用它。

这是在CreateView上的Fragment的代码没有被正确调用

`公共类Fragment1扩展Fragment{

ShimmerFrameLayout shimmerFrameLayout ;
ConstraintLayout contentLayout;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toast.makeText(getActivity(), "US News", Toast.LENGTH_SHORT).show();
Log.d("Called", "onCreate: ");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.us_news_fragment_layout , container , false);
shimmerFrameLayout = view.findViewById(R.id.usNewsShimmerLayoutId);
contentLayout = view.findViewById(R.id.usNewsLayoutId);
shimmerFrameLayout.startShimmerAnimation();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
shimmerFrameLayout.stopShimmerAnimation();
shimmerFrameLayout.setVisibility(View.GONE);
contentLayout.setVisibility(View.VISIBLE);
}
},3000);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.d("USNews", "onCreateView: ");
}

}`

这是主"活动"中的代码,用于处理与视图寻呼机相关的事件

viewPager = findViewById(R.id.homeViewPagerId);
tabLayout.setupWithViewPager(viewPager);
tabLayout.addTab(tabLayout.newTab().setText("Home"));
tabLayout.addTab(tabLayout.newTab().setText("US News"));
tabLayout.addTab(tabLayout.newTab().setText("Politics"));
tabLayout.addTab(tabLayout.newTab().setText("Live"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
int position = tab.getPosition();
viewPager.setCurrentItem(position);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
homePagerAdapter = new HomePagerAdapter(getSupportFragmentManager() , tabLayout.getTabCount());
viewPager.setAdapter(homePagerAdapter);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

//Toast.makeText(MainActivity.this,String.valueOf(tabLayout.getTabAt(position(.getText(((+"现在是活动的";,干杯LENGTH_SHORT(.show((;主页适配器.getItem(位置(;}

@Override
public void onPageSelected(int position) {
homePagerAdapter.getItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
homePagerAdapter.notifyDataSetChanged();

这是ViewPager的适配器,我正在使用

public class HomePagerAdapter extends FragmentStatePagerAdapter {
int NUM_OF_TABS;
private String[] tabTitles = new String[]{"Home", "US News", "Politics" , "Live"};
public HomePagerAdapter(@NonNull FragmentManager fm , int numberOfTabs) {
super(fm);
this.NUM_OF_TABS = numberOfTabs;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return tabTitles[position];
}
@NonNull
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
Fragment0 homeFragment = new Fragment0 ();
return  homeFragment;
case 1:
Fragment1 usNewsFragment = new Fragment1 ();
return usNewsFragment;
case 2:
Fragment2 politicsFragment = new Fragment2 ();
return politicsFragment;
case 3:
Fragment3 liveFragment = new Fragment3 ();
return  liveFragment;
default:
return null;
}
}
@Override
public int getCount() {
return NUM_OF_TABS;
}

}

请帮我做这件事。我将非常感谢你。

提前感谢

也许这个布局已经创建并绘制好了?ViewPager有一些方便的选项-在内存中至少保留两个额外的Views/Fragments,以便在页面之间快速切换。您只能通过调用setOffsetscreenPageLimit将此值更改为更高的值。默认情况下,其设置为1-意味着ViewPager最多保持3个Fragments-一个在左侧,一个在右侧,一个当前在屏幕上可见。用手指拖动UI可以向左/向右滑动页面,而不会从头开始绘制(几乎总是会出现一些小故障/挂起(

我敢打赌,在Activity开始时,您有两个onCreate调用-Fragment0s和Fragment1s。当您切换到Fragment1时,您将看到Fragment2日志,因为ViewPager将为潜在的下一次向左滑动手势做好准备。您可以始终使用setOffscreenPageLimit(Integer.MAX_VALUE);来强制所有Fragment在开始时绘制并保存在内存中(但前提是这些Fragment不太重,根据您的选项卡名称,它们可能是…(

onPageSelectedonPageScrolled中的homePagerAdapter.getItem(position);调用也是不必要的——它正在创建新的Frament并返回它,仅此而已,它没有被使用。ViewPager的工作是调用这个方法(从连接的适配器(,取这个Fragment并绘制(在屏幕上或只是在内存中渲染,以备用户向左/向右滑动时使用(

最新更新