我目前正在尝试使用片段,但我遇到了一个无法解决的问题。
我有一个活动,其中包含4个不同的片段。从这个活动中,我启动了一个ASyncTask,它进入网络并获得我需要的不同数据,然后将其发送到片段。
但是,当我的应用程序被杀死并再次打开时,或者当我更改方向时,我的片段显然已经重新创建,并且我的自定义FragmentAdapter不能保留对片段的良好引用。
以下是我主要活动的代码。
public class MainActivity extends FragmentActivity {
MyPagerAdapter fgsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//...
FragmentManager fm = super.getSupportFragmentManager();
fgsAdapter = new MyPagerAdapter(fm,this);
ViewPager myPager = (ViewPager) findViewById(R.id.home_pannels_pager);
myPager.setAdapter(fgsAdapter);
myPager.setCurrentItem(0);
}
@Override
protected void onResume() {
super.onResume();
ATaskGetUser task = new ATaskGetUser(callback, (ProgressBar) findViewById(R.id.PB_AsyncTask));
task.execute();
}
//What's called by the ASyncTask onPostExecute()
private void notifyDataChanged() {
fgsAdapter.notifyFragments(user.getItems());
}
private class MyPagerAdapter extends FragmentPagerAdapter {
private List<CardFragment> fragments = new ArrayList<CardFragment>();
private Context c;
public MyPagerAdapter(FragmentManager fm, Context c) {
super(fm);
CardFragment h = new HabitFragment();
CardFragment d = new DailyFragment();
CardFragment t = new ToDoFragment();
CardFragment r = new RewardFragment();
fragments.add(h);
fragments.add(d);
fragments.add(t);
fragments.add(r);
}
public int getCount() {
return fragments.size();
}
@Override
public CardFragment getItem(int position) {
Log.v("MainActivity_fgsmanager", "getItem()");
CardFragment f = (CardFragment) this.fragments.get(position);
return f;
}
public void notifyFragments(List<HabitItem> items) {
for(OnTasksChanged f : fragments) {
f.onChange(items);
}
}
}
}
所以,我希望能够做的是能够在我的notifyDataChanged
函数中调用onChange(由我的四个片段实现的接口)。这是可能的吗,我在想错误的方式吗?
答案 0 :(得分:0)
我使用Fragments遇到了同样的问题,在每次屏幕旋转后我都丢失了当前的片段。
我只是通过在Fragment类中添加一行来解决它(不在父FragmentActivity类中):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.rate_fragment, container,false);
setRetainInstance(true);//Added not to lose the fragment instance during screen rotations
(...)
对于您的应用被杀死并再次打开的情况,我不确定它是否可行。