我有一个非常简单的问题。我在我的应用程序中使用了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();
}
答案 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,我认为它应该可以解决这个问题。
答案 2 :(得分:-1)
只需使用一种覆盖方法更新片段:
@Override
protected void onStart() {
super.onStart();
checkBox.setChecked(false);
}