2

我有这个活动,我运行一个收集一系列数据的异步任务。该数据可以用多种方式表示,为了简单起见,假设有两种方式。我希望用户能够在这两种表示(列表视图和图形视图)之间切换。

所以我用我的 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。

此外,在切换片段时,它们的数据不会更新(即我从列表片段开始,它显示正确的数据,然后切换到图形,没有数据显示,切换回列表,再次没有数据。)

4

1 回答 1

2

如果在使用时字段为空setRetainInstance(true);,那么您正在您的活动中重新创建它们(片段)。确保你在你的活动中设置了一些东西,所以onSaveInstanceState()in不会为空,它甚至可以是一个空包或无用的变量,例如:onCreate()savedInstanceState

@Override
public void onSaveInstanceState(Bundle outstate){
    super.onSaveInstanceState(outstate);
    outstate.putBoolean("stateChanged", true);
}

只需确保在添加参数之前调用 super 即可。

另一方面,我个人从未将我的片段存储在数组中。我在我的活动中使用 aFrameLayout作为片段容器,就像你一样,如果我需要更新我刚刚调用的东西:getSupportFragmentManager().findFragmentById(R.id.fragment_container).setWhatINeed();这样我总是得到可见的片段。

让我知道更新的进展情况,我会用我能提供的任何信息更新这篇文章。

于 2013-03-09T21:12:47.040 回答