第一次在 ViewPager 中加载时出现黑色片段
Black Fragment when loaded the first time in ViewPager
我有一个 FragmentActivity,它在视图寻呼机中加载 3 个片段。在每次全新安装时,都会加载第二个片段,但很快就会变黑。在此之后,第二个片段被重新加载并且即使在浏览视图时也能正常工作。因此,它仅在第一次加载时变黑。我使用 FragmentPagerAdapter 和 FragmentStatePagerAdapter 实现了这个,但它的行为是一样的。这只发生在 KitKat 和 Lollipop 上。所有片段都有简单的布局,没有嵌套片段。
public class IntroActivity extends FragmentActivity {
private List<Fragment> listFragments;
private PagerAdapter pagerAdapterWelcome;
private OnboardingPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intro_pager);
viewPager = (OnboardingPager) findViewById(R.id.viewPager);
//Initializing the List
listFragments = new ArrayList<Fragment>();
//initializing the fragments
WelcomeFragment welcomeFragment = new WelcomeFragment();
TicketScanFragment ticketOptionScanFragment = new TicketScanFragment();
ScannerFragment scanFragment = new ScannerFragment();
//Adding Fragments to List
listFragments.add(welcomeFragment);
listFragments.add(ticketOptionScanFragment);
listFragments.add(scanFragment);
//initializing PagerAdapter
pagerAdapterWelcome = new PagerAdapter(getSupportFragmentManager(), listFragments);
viewPager.setAdapter(pagerAdapterWelcome);
final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabDots);
tabLayout.setupWithViewPager(viewPager, true);
}
适配器:
public class PagerAdapter extends FragmentStatePagerAdapter {
private List<Fragment> listFragments;
public PagerAdapter(FragmentManager fm, List<Fragment> listFragments) {
super(fm);
this.listFragments = listFragments;
}
@Override
public Fragment getItem(int i) {
return listFragments.get(i);
}
@Override
public int getCount() {
return listFragments.size();
}
}
希望这对您的情况有所帮助:您可以尝试对实例化视图寻呼机适配器的方式进行以下更改:
//initializing PagerAdapter
pagerAdapterWelcome = new PagerAdapter(getChildFragmentManager(), listFragments);
这里是文档link:documentation nested fragments
问题出在实例化 SurfaceView 的第三个片段。似乎 ViewPager 默认情况下会销毁并创建屏幕外的视图。所以为了阻止这个,我在我的 FragmentActivity
中添加了
viewPager.setOffscreenPageLimit(listFragments.size());
以此指定不可破坏的视图数。在添加这个之前,ViewPager 的子级数量总是比一页小,现在我明白了为什么,SurfaceView 总是因为它在屏幕之外而被销毁。终于不黑了screen/flicker.
我有一个 FragmentActivity,它在视图寻呼机中加载 3 个片段。在每次全新安装时,都会加载第二个片段,但很快就会变黑。在此之后,第二个片段被重新加载并且即使在浏览视图时也能正常工作。因此,它仅在第一次加载时变黑。我使用 FragmentPagerAdapter 和 FragmentStatePagerAdapter 实现了这个,但它的行为是一样的。这只发生在 KitKat 和 Lollipop 上。所有片段都有简单的布局,没有嵌套片段。
public class IntroActivity extends FragmentActivity {
private List<Fragment> listFragments;
private PagerAdapter pagerAdapterWelcome;
private OnboardingPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intro_pager);
viewPager = (OnboardingPager) findViewById(R.id.viewPager);
//Initializing the List
listFragments = new ArrayList<Fragment>();
//initializing the fragments
WelcomeFragment welcomeFragment = new WelcomeFragment();
TicketScanFragment ticketOptionScanFragment = new TicketScanFragment();
ScannerFragment scanFragment = new ScannerFragment();
//Adding Fragments to List
listFragments.add(welcomeFragment);
listFragments.add(ticketOptionScanFragment);
listFragments.add(scanFragment);
//initializing PagerAdapter
pagerAdapterWelcome = new PagerAdapter(getSupportFragmentManager(), listFragments);
viewPager.setAdapter(pagerAdapterWelcome);
final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabDots);
tabLayout.setupWithViewPager(viewPager, true);
}
适配器:
public class PagerAdapter extends FragmentStatePagerAdapter {
private List<Fragment> listFragments;
public PagerAdapter(FragmentManager fm, List<Fragment> listFragments) {
super(fm);
this.listFragments = listFragments;
}
@Override
public Fragment getItem(int i) {
return listFragments.get(i);
}
@Override
public int getCount() {
return listFragments.size();
}
}
希望这对您的情况有所帮助:您可以尝试对实例化视图寻呼机适配器的方式进行以下更改:
//initializing PagerAdapter
pagerAdapterWelcome = new PagerAdapter(getChildFragmentManager(), listFragments);
这里是文档link:documentation nested fragments
问题出在实例化 SurfaceView 的第三个片段。似乎 ViewPager 默认情况下会销毁并创建屏幕外的视图。所以为了阻止这个,我在我的 FragmentActivity
中添加了viewPager.setOffscreenPageLimit(listFragments.size());
以此指定不可破坏的视图数。在添加这个之前,ViewPager 的子级数量总是比一页小,现在我明白了为什么,SurfaceView 总是因为它在屏幕之外而被销毁。终于不黑了screen/flicker.