gpt4 book ai didi

android - 在两个固定 fragment 之间切换

转载 作者:行者123 更新时间:2023-11-29 00:31:38 27 4
gpt4 key购买 nike

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

所以我用我的 ListFragment 和我的 GraphicFragment 创建了一个 FragmentActivity。

如何在这两者之间切换以便用户可以来回切换?我尝试使用替换,但随后前一个 fragment 被销毁,这不是我感兴趣的,因为它的引用具有我的 Activity 传递的数据。 (即我不想每次用户在 View 之间切换时都重新创建 fragment )。

我也试过隐藏和显示,但我无法让它工作,其中一个 fragment 没有显示。

此外,当我旋转时,我猜 fragment 会被破坏,因为我在尝试访问它们时遇到空指针异常。

    @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;
}

当我尝试访问 fragment 字段以更新它们的数据时出现问题:

     for(IMyFragment frag: fragments){
frag.updateData(data);
}

旋转屏幕后出现 NullPointerException。

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

最佳答案

如果在使用 setRetainInstance(true); 时字段为空,那么您将在 Activity 中重新创建它们( fragment )。确保您在 Activity 中的 onSaveInstanceState() 中设置了一些内容,以便在 onCreate() 中,savedInstanceState 不会为 null,它甚至可以是空包或无用变量,例如:

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

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

另一方面,我个人从未将 fragment 存储在数组中。我在 Activity 中使用 FrameLayout 作为 fragment 容器,就像您一样,如果我需要更新某些内容,我只需调用:getSupportFragmentManager().findFragmentById(R.id.fragment_container)。 setWhatINeed(); 这样我总能得到可见的 fragment 。

让我知道更新的进展情况,我会尽我所能更新这篇文章。

关于android - 在两个固定 fragment 之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15314550/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com