当我在viewpager中滑动到或从相邻片段(0,2)中选择fragment1(片段编号为0-3)时,它的oncreateview或oncreate函数没有被调用。
但是当我从fragment3滑回或在fragment3激活时选择fragment1时,这两个函数都被调用。我不明白为什么不能从相邻的片段中调用它。
这是未正确调用oncreateview的片段的代码
`公共类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相关的事件的代码
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())+“现在处于活动状态”,toast.length\u short.show();homepageradapter.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;
}
}
请帮我处理这件事。我会非常感谢你的。
提前谢谢
1条答案
按热度按时间czq61nw11#
也许这个布局已经创建和绘制了?
ViewPager
有一些方便的选择-保持至少两个额外的View
s码/Fragment
在内存中的快速切换页面。只能通过调用setoffscreenpagelimit将此值更改为更高的值。默认设置为1-意味着ViewPager
最多3个Fragment
一个在左边,一个在右边,还有一个在屏幕上。使用finger fling,用户界面只需左右滑动页面,而无需从头开始绘制(几乎总是出现一些小问题/挂起)我打赌你有两个
onCreate
一开始就打电话Activity
-Fragment0
s和Fragment1
s。当你切换到Fragment1
你会看到的Fragment2
日志,如ViewPager
将为可能的下一个向左滑动手势做好准备。你可以随时使用setOffscreenPageLimit(Integer.MAX_VALUE);
强迫所有人Fragment
在开始时绘制并保存在内存中(但仅当Fragment
不是太重,根据你的标签名称,它们可能是……)也
homePagerAdapter.getItem(position);
呼叫onPageSelected
以及onPageScrolled
是不必要的-它正在创造新的Frament
把它还回去,就这样,它没用过。那是ViewPager
要调用此方法(从连接的适配器),请执行以下操作Fragment
并绘制(在屏幕上或仅在内存中渲染,以便在用户向左/向右滑动时使用)