当前位置: 首页 > 知识库问答 >
问题:

Viewpager片段%1 onCreateView并不总是被调用

袁宜民
2023-03-14

当我在viewPager中从其相邻片段(0,2)中滑动到或选择Fragment1(片段编号为0-3)时,它的onCreateView或onCreate函数未被调用。

但是当我从Fragment3回扫或者选择Fragment1(当Fragment3是活动的)时,这两个函数都被调用了。我很困惑为什么不从相邻的片段中调用它。

这是未正确调用onCreateView的片段的代码

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())+“is Active Now”,Toast.Length_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个答案

仲孙阳
2023-03-14

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

我打赌您在活动开始时有两个oncreate调用-fragment0s和fragment1s。切换到fragment1时,您将看到fragment2日志,因为viewpager将为可能的下一个向左滑动手势准备日志。您可以始终使用setoffscreenpagelimit(integer.max_value);强制在开始时绘制所有片段并将其保存在内存中(但仅当这些片段不太重时,根据您的选项卡名称,它们可能是...)

此外,在OnPageSelectedOnPageScrolled中的HomePagerAdapter.getItem(位置);调用也是不必要的-它正在创建新的Frament并返回它,仅此而已,它没有被使用。这是viewpager的任务,调用此方法(从附加的适配器),获取此片段并绘制(在屏幕上或只是呈现在内存中,以备将来用户向左/向右滑动时使用)

 类似资料:
  • 嗨,我在主片段内使用带有碎片网的viewPager。我试图从画廊或相机中获取图像到位图,但在选择照片并启动ActivityForResult后,它不会在onActivityResult中捕获... 以下是我如何调用startActivityForResult: 这是我的onActivityResult: 有什么想法吗?

  • 如何限制我的主要活动不返回片段的最后一页,一旦从片段的最后一页返回到主要活动,就像我有一个主活动一样,单击按钮,该主活动会导致另外3个活动,其中一个活动有片段。片段的最后一页指向home activity,但当我在home activity上后退时,它再次将我引导到片段的最后一页,然后我再次按下back按钮,然后我的应用程序关闭 我的主要活动课 公共类主页扩展应用程序活动{ } 我零星的寻呼机 公

  • 我在活动的中放置了一些缓存清理代码,但大多数情况下,除非通过显式地完成活动,否则这些代码不会执行。 编辑:只读仅在或系统资源不足时调用。那么我需要把我的缓存清理代码放在哪里呢?如果我把它放在中,用户返回到应用程序,缓存就会被清除。我实际上是在缓存中存储重要的临时文件,这些文件不应该在中删除。

  • 所以我用FragmentStatePagerAdapter实现了一个ViewPager,我有两个片段。我用参数1和2调用了setOffscreenPageLimit(),希望片段不会被重新创建,但是第一个片段总是被重新创建,而第二个片段被创建。 第一个片段总是经过这些步骤,只要它离开视野(向右滑动到另一个片段,或者点击主页按钮,等等...) on暂停 onStop onAttach 创建 onCr

  • 我的应用程序有两个项目的导航抽屉:一个ViewPager(在一个片段内)和支持Map碎片。 ViewPager使用FragmentStatePagerAdapter并返回两个片段。 当我打开抽屉菜单并选择“项目1”(支持MapFrature)时,另一个碎片(ViewPager在其中)执行,但此方法不会破坏适配器创建的碎片,所以当我再次选择“项目0”时,我的应用程序创建的ViewPager与它的两个