如何使用 viewpager 一次创建一个片段
How to create one fragment at a time using viewpager
我在 viewpager 中使用了两个片段。在第二个片段中,我使用 exoplayer 播放来自 url 的视频。我的问题是,当 activity 启动时,视频会自动加载,因为所有片段都是由 viewpager 自动创建的。如何一次创建一个框架,以便第二个片段仅在用户可见(通过滑动或点击选项卡)时才能播放视频。
viewpager 适配器
class ViewPagerAdapter extends FragmentStatePagerAdapter {
Bundle bundle;
public ViewPagerAdapter(FragmentManager manager, Bundle bundle) {
super(manager);
this.bundle = bundle;
}
@Override
public Fragment getItem(int position) {
Log.d("getItem", position + "");
switch (position) {
case 0:
IngredientListFragment ingredientListFragment = new IngredientListFragment();
ingredientListFragment.setArguments(bundle);
return ingredientListFragment;
case 1:
StepsListFragment stepsListFragment = new StepsListFragment();
stepsListFragment.setArguments(bundle);
return stepsListFragment;
default:
IngredientListFragment ing = new IngredientListFragment();
ing.setArguments(bundle);
return ing;
}
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Ingredients";
case 1:
return "Steps";
default:
return "Ingredients";
}
}
}
里面activity
final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), bundle);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
请帮忙。
您不需要一次创建一个片段:
当用户打开该片段时,在第二个片段中使用此代码 运行 exoplayer:
private boolean _hasLoadedOnce = false; // your boolean field
@Override
public void setUserVisibleHint(boolean isFragmentVisible_) {
super.setUserVisibleHint(true);
if (this.isVisible()) {
if (isFragmentVisible_ && !_hasLoadedOnce) {
// move exoplayer code here so this code run only when user select this fragment
_hasLoadedOnce = true;
}
}
}
还有一件事,你必须在创建viewpager之后加入这一行:
在你的情况下
tabLayout.setupWithViewPager(viewPager);
viewPager.setOffscreenPageLimit(1);
我在 viewpager 中使用了两个片段。在第二个片段中,我使用 exoplayer 播放来自 url 的视频。我的问题是,当 activity 启动时,视频会自动加载,因为所有片段都是由 viewpager 自动创建的。如何一次创建一个框架,以便第二个片段仅在用户可见(通过滑动或点击选项卡)时才能播放视频。
viewpager 适配器
class ViewPagerAdapter extends FragmentStatePagerAdapter {
Bundle bundle;
public ViewPagerAdapter(FragmentManager manager, Bundle bundle) {
super(manager);
this.bundle = bundle;
}
@Override
public Fragment getItem(int position) {
Log.d("getItem", position + "");
switch (position) {
case 0:
IngredientListFragment ingredientListFragment = new IngredientListFragment();
ingredientListFragment.setArguments(bundle);
return ingredientListFragment;
case 1:
StepsListFragment stepsListFragment = new StepsListFragment();
stepsListFragment.setArguments(bundle);
return stepsListFragment;
default:
IngredientListFragment ing = new IngredientListFragment();
ing.setArguments(bundle);
return ing;
}
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Ingredients";
case 1:
return "Steps";
default:
return "Ingredients";
}
}
}
里面activity
final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), bundle);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
请帮忙。
您不需要一次创建一个片段: 当用户打开该片段时,在第二个片段中使用此代码 运行 exoplayer:
private boolean _hasLoadedOnce = false; // your boolean field
@Override
public void setUserVisibleHint(boolean isFragmentVisible_) {
super.setUserVisibleHint(true);
if (this.isVisible()) {
if (isFragmentVisible_ && !_hasLoadedOnce) {
// move exoplayer code here so this code run only when user select this fragment
_hasLoadedOnce = true;
}
}
}
还有一件事,你必须在创建viewpager之后加入这一行: 在你的情况下
tabLayout.setupWithViewPager(viewPager);
viewPager.setOffscreenPageLimit(1);