我有这个活动,我运行一个收集一系列数据的异步任务。该数据可以用多种方式表示,为了简单起见,假设有两种方式。我希望用户能够在这两种表示(列表视图和图形视图)之间切换。
所以我用我的 ListFragment 和我的 GraphicFragment 创建了一个 FragmentActivity。
你如何在这两者之间切换,以便用户可以来回切换?我尝试使用替换,但是前一个片段被破坏了,这不是我感兴趣的,因为它的引用具有我的 Activity 传递的数据。(即我不想在每次用户在视图之间切换时重新创建片段)。
我也尝试隐藏和显示,但我无法让它工作,其中一个片段没有显示。
另外,当我旋转时,我猜碎片会被破坏,因为我在尝试访问它们时得到了一个空指针异常。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
pBar = (ProgressBar) findViewById(R.id.analyzingProgress);
// However, if we're being restored from a previous state, then don't
// create the fragment again (please)
if (savedInstanceState == null) {
firstFragment = new DirListFragment();
secondFragment = new GraphViewFragment();
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, secondFragment).commit();
fragments= new ArrayList<IFragment>();
fragments.add(firstFragment);
fragments.add(secondFragment);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.listView){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
/*transaction.hide(secondFragment);
transaction.show(firstFragment);*/
transaction.replace(R.id.fragment_container, firstFragment);
transaction.addToBackStack(null);
transaction.commit();
}
else if(item.getItemId() == R.id.graph){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
/*transaction.hide(firstFragment);
transaction.show(secondFragment);*/
transaction.replace(R.id.fragment_container, secondFragment);
transaction.addToBackStack(null);
transaction.commit();
}
return true;
}
当我尝试访问片段字段以更新其数据时,问题就来了:
for(IMyFragment frag: fragments){
frag.updateData(data);
}
旋转屏幕后出现 NullPointerException。
此外,在切换片段时,它们的数据不会更新(即我从列表片段开始,它显示正确的数据,然后切换到图形,没有数据显示,切换回列表,再次没有数据。)