Android:声音在Fragment中播放了两次

时间:2013-11-13 23:33:52

标签: android fragment android-mediaplayer

我想根据每个片段的位置播放特定的声音 我的实现如下:

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;
    }

}

当我启动我的应用程序时,它会在第一个片段中同时播放两个声音,但在其他片段中声音播放正常,我怎样才能在每个片段上播放一个声音?

1 个答案:

答案 0 :(得分:2)

ViewPager的默认行为是在内存中最多保留3个项目。这意味着当你的应用程序启动时,它将获得位置0和位置1的碎片(这确保打开第二个项目是平滑的)。

要解决您的问题,您应该检查您的片段是否可见,然后播放声音。

更新:您可以通过调用Fragment.isVisible();来检查片段是否可见。这意味着:(1)已添加,(2)其视图附加到窗口,(3)未隐藏。如果我正确理解文档,您应该能够使用onCreateView()方法进行检查。

请注意,根据内存中保存的片段数量(默认情况下为3(当前片段+左右片段),这可能会产生奇怪的结果。您可能希望使用onStart()或onResume(),但你可以玩弄它来检查出你的需求。