我想根据每个片段的位置播放特定的声音 我的实现如下:
MainActivity:
public class MainActivity extends FragmentActivity{
private DescAdapter adapter;
private ViewPager pager;
static int QUESTIONS_COUNT=4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
adapter = new DescAdapter(getSupportFragmentManager());
pager = (ViewPager) findViewById(R.id.pager);
// Set Adapter to pager:
pager.setAdapter(this.adapter);
pager.setCurrentItem(0);
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(final int pos) {
// TODO Auto-generated method stub
pager.setCurrentItem(pos,true);
adapter.notifyDataSetChanged();
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
});
}
public class DescAdapter extends FragmentStatePagerAdapter {
public DescAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() throws NullPointerException{
return QUESTIONS_COUNT;
}
@Override
public Fragment getItem(int position) throws NullPointerException{
QuizFragment frag = new QuizFragment();
Bundle bundle = new Bundle();
bundle.putInt("quizPosition", position);
frag.setArguments(bundle);
return frag;
}
}
}
FragmentActivity:
public class QuizFragment extends Fragment {
private int mPos=1;
static int QUIZ_SOUNDS[]={R.raw.sound_1,R.raw.sound_2,R.raw.sound_3,R.raw.sound_4};
SoundPlayer sp=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPos=getArguments().getInt("quizPosition");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment, container, false);
sp = new SoundPlayer();
sp.initSoundPlayer(QUIZ_SOUNDS[mPos]);
sp.playSound(getActivity());
return view;
}
}
当我启动我的应用程序时,它会在第一个片段中同时播放两个声音,但在其他片段中声音播放正常,我怎样才能在每个片段上播放一个声音?
答案 0 :(得分:2)
ViewPager的默认行为是在内存中最多保留3个项目。这意味着当你的应用程序启动时,它将获得位置0和位置1的碎片(这确保打开第二个项目是平滑的)。
要解决您的问题,您应该检查您的片段是否可见,然后播放声音。
更新:您可以通过调用Fragment.isVisible();
来检查片段是否可见。这意味着:(1)已添加,(2)其视图附加到窗口,(3)未隐藏。如果我正确理解文档,您应该能够使用onCreateView()
方法进行检查。
请注意,根据内存中保存的片段数量(默认情况下为3(当前片段+左右片段),这可能会产生奇怪的结果。您可能希望使用onStart()或onResume(),但你可以玩弄它来检查出你的需求。