0

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

主要活动:

 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;

    }

}


}

片段活动:

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

}

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

4

1 回答 1

2

ViewPager 的默认行为是在内存中最多保留 3 个项目。这意味着当你的应用启动时,它会同时获取位置 0 和位置 1 的 Fragments(这可以确保打开第二个项目是顺利的)。

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

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

请注意,取决于内存中保存的片段数量(默认情况下为 3(当前片段 + 左右片段),这可能会产生奇怪的结果。您可能想要使用 onStart() 或 onResume(),但您可以玩用它来检查什么适合你的需要)。

于 2013-11-14T00:37:20.593 回答