选择片段 A 时如何在 ViewPager 上不一起启动所有片段
Posted
技术标签:
【中文标题】选择片段 A 时如何在 ViewPager 上不一起启动所有片段【英文标题】:How to not start all fragments together on ViewPager when fragment A is selected 【发布时间】:2018-07-23 18:24:44 【问题描述】:所以我使用 ViewPager 让我的应用程序更快,而不是为每个布局使用 activity。
问题是,在活动中,您可以在 onCreate 中编写代码 它只会在您开始活动时开始,对吧?
但是当你使用 Fragments 和 fragmentPagerAdapter 并为它们使用 ViewPager 时。
您的所有片段都将一起启动它们的 (onCreateView)即使您的 ViewPager 只显示第一个片段!
如果您在片段的开头播放声音或动画,它将在后台开始!
这是我的 fragmentPagerAdapter 类:
public class PagerAdapter extends FragmentStatePagerAdapter
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitle = new ArrayList<>();
public PagerAdapter(FragmentManager fm)
super(fm);
@Override
public Fragment getItem(int position)
return mFragmentList.get(position);
@Override
public int getCount()
return mFragmentList.size();
public void addFragment(Fragment fragment, String title)
mFragmentList.add(fragment);
mFragmentTitle.add(title);
我有这个(第二个片段)我不希望它在没有被选中的情况下开始!
public class GameFragment extends Fragment
private View gameLayout
private Animation showBtn;
private Button button;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
gameLayout = inflater.inflate(R.layout.game_layout, container, false);
button = gameLayout .findViewById(R.id.button);
// loading my anim xml file
showBtn = AnimationUtils.loadAnimation(getContext(),R.anim.btn_show);
button.startAnimation(showBtn);
loadLevel();
return gameLayout
最后这是我有 ViewPager 的活动:
public class ControllerActivity extends AppCompatActivity
public CustomPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_controller);
viewPager = findViewById(R.id.viewPager);
PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());
adapter.addFragment(new HomeFragment(),"Home");
adapter.addFragment(new GameFragment(),"Game");
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(0);
我需要你的帮助来告诉我我在这里的错误以及正确的方法是什么
【问题讨论】:
【参考方案1】:在 View Pager 中使用 OnPageChangeListener,您可以检测当前在 View Pager 中显示的片段。然后,您需要检查显示的是哪个片段,然后调用该片段的类上的方法来启动任何声音,例如,在片段成为视图中的片段之前您不想启动的声音。
您应该为此使用接口。
Here你可以找到一个使用 OnPageChangeListener 的例子。
Here你可以找到一个使用接口的Activity到Fragment通信的例子。此示例有很多与您的用例无关的代码,但演示了接口的使用。
【讨论】:
因为我是初学者还有一个问题,在 OnCreateView 中为每个片段编写繁重的代码是不是很糟糕?比如初始化事物和视图。?或者我到底在哪里做的。 在 onCreateView 中初始化视图就好了,事实上,这是他们应该去的地方,因为这个方法只在创建视图时调用(很有趣),所以视图只会被创建一次. 够清楚了!现在我只需要学习如何从游戏片段内部调用方法:@Override public void onPageSelected 上网看看。如果您遇到困难,请作为另一个问题提出:) 你能看看我的新问题吗?没人在乎:(***.com/q/48912872/8729401【参考方案2】:“可能”的一种方法是在 onCreateView 中初始化片段的视图:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
view = inflater.inflate(R.layout.fragment_media_viewer, container, false);
return view;
然后在重写 setUserVisibleHint() 函数并在那里进行其余的初始化。当片段在视图中时调用此函数。
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
super.setUserVisibleHint(isVisibleToUser);
// do the rest of the code here.
我还没有为此目的使用 setuserVisibleHint。但是你可以试试。也告诉我。
【讨论】:
你试过了吗?它给了我一个错误:尝试在空对象引用上调用虚拟方法“android.content.res.Resources android.content.Context.getResources()” 我没有专门为此目的使用 setUserVisibleHint,但我会检查一下并更新我的答案。 嘿伙计,我尝试从相同的地方执行一些非 ui 函数,并且成功了。 @Override public void setUserVisibleHint(boolean isVisibleToUser) super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) Log.e(this.getClass().toString(), "获取所有账户"); fetchAccountsFromServer(); 和一些 UI 也可以工作......这也工作了 :) :) 我从 onCreateView 初始化了主视图,然后在 setUserVisibleHint 中初始化了其余的东西。工作正常。 :)以上是关于选择片段 A 时如何在 ViewPager 上不一起启动所有片段的主要内容,如果未能解决你的问题,请参考以下文章
如何在将 Tablayout 与 viewpager 一起使用时从另一个片段调用 AsyncTask?
在ViewPager上,在onPageSelected上的片段上启动动画