viewpager片段1 oncreateview并不总是被调用

yrwegjxp  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(487)

当我在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;
}

}
请帮我处理这件事。我会非常感谢你的。
提前谢谢

czq61nw1

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 并绘制(在屏幕上或仅在内存中渲染,以便在用户向左/向右滑动时使用)

相关问题