ViewPager再次激活位置checkBox事件

时间:2015-12-16 08:21:43

标签: android

我有一个非常简单的问题。我在我的应用程序中使用了View Pager和FragmentStatePagerAdapter。

分别查看寻呼机标签位置:游戏|电影|学习

我在StudyFragment中使用了复选框。首先,我选中了Study选项卡中的复选框并更改了标签位置(例如Game Tab)。然后我重新单击Study Tab复选框,OnCheckedListener事件处于活动状态,并再次出现Toast消息。我的PagerAdapter代码如下所示:

public class PagerAdapter  extends FragmentStatePagerAdapter{
    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        Fragment frag=null;
        switch (position){
            case 0:
                frag=new GameFragment();
                Log.i("PagerAdapter","pos0");
                break;
            case 1:
                frag=new MovieFragment();
                Log.i("PagerAdapter","pos1");

                break;
            case 2:
                frag=new StudyFragment();
                Log.i("PagerAdapter","pos2");

                break;
        }
        return frag;
    }



    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        String title=" ";
        switch (position){
            case 0:
                title="Game";
                break;
            case 1:
                title="Movie";
                break;
            case 2:
                title="Study";
                break;
        }

        return title;
    }
}

研究片段代码如下:

public class StudyFragment extends Fragment {

CheckBox checkBox;
    public StudyFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v=inflater.inflate(R.layout.fragment_study, container, false);
        checkBox=(CheckBox)v.findViewById(R.id.checkBox);

        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked) {
                    Toast.makeText(getActivity(), "checked", Toast.LENGTH_SHORT).show();
                }
                else
                    Toast.makeText(getActivity(), "not checked", Toast.LENGTH_SHORT).show();
            }
        });
        return v;
    }


}

我不希望在更改标签时再次显示该Toast消息。所以我不想在重新更改标签时触发checkBox isChecked决定如何解决?

我为我解决了问题。当我更改标签时,我会破坏以前的片段。 添加此行ViewPagerAdapter

@Override
    public void destroyItem(ViewGroup container, int position, Object object) {
            FragmentManager manager = ((Fragment) object).getFragmentManager();
            FragmentTransaction trans = manager.beginTransaction();
            trans.remove((Fragment) object);
            trans.commit();

    } 

3 个答案:

答案 0 :(得分:1)

checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)   {
        //do stuff
    if(isChecked) {
                Toast.makeText(getActivity(), "checked", Toast.LENGTH_SHORT).show();
            }
            else
                Toast.makeText(getActivity(), "not checked", Toast.LENGTH_SHORT).show();
        }

    }
});

还为您的ViewPager对象提供pageoffsetlimit:

viewPagerObj.setOffscreenPageLimit(3);

如果它不起作用,请告诉我我将帮助您解决问题并找到其他解决方案:)

答案 1 :(得分:-1)

“FragmentStatePagerAdapter用于填充ViewPager中的大量片段,当片段对用户不可见时它会销毁片段,并且只有片段的savedInstanceState包保存在内存中。当重新访问页面时,适配器会创建一个新的例子。“

这就是为什么你再次看到烤面包的原因。

尝试使用FragmentPagerAdapter而不是FragmentStatePager,我认为它应该可以解决这个问题。

check out this post for more details

答案 2 :(得分:-1)

只需使用一种覆盖方法更新片段:

@Override
protected void onStart() {
    super.onStart();
    checkBox.setChecked(false);
}