当我在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;
}
}
也许这个布局已经创建并绘制好了?ViewPager
有一些方便的选项--在内存中保留至少两个附加的View
s/Fragment
以便在页面之间快速切换。您只能通过调用SetOffScreenPageLimit将此值更改为更高的值。默认情况下,将其设置为1-意味着viewpager
最多保留3个fragment
s-一个在左侧,一个在右侧,一个当前在屏幕上可见。使用finger fling,UI只需向左/向右滑动页面,而无需从头开始绘制(几乎总是出现一些小故障/挂起)
我打赌您在活动
开始时有两个oncreate
调用-fragment0
s和fragment1
s。切换到fragment1
时,您将看到fragment2
日志,因为viewpager
将为可能的下一个向左滑动手势准备日志。您可以始终使用setoffscreenpagelimit(integer.max_value);
强制在开始时绘制所有片段
并将其保存在内存中(但仅当这些片段
不太重时,根据您的选项卡名称,它们可能是...)
此外,在OnPageSelected
和OnPageScrolled
中的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与它的两个