Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何正确使用片段_Android_Android Fragments - Fatal编程技术网

Android 如何正确使用片段

Android 如何正确使用片段,android,android-fragments,Android,Android Fragments,在我的基本活动类中,我有指向我从菜单调用的所有片段的链接 大概是这样的: BaseFragment mProjects; BaseFragment mProfile; public BaseFragment getFragment(FragmentType type) { BaseFragment fr = null; switch (type) { case PROFILE: fr = new Profi

在我的基本活动类中,我有指向我从菜单调用的所有片段的链接

大概是这样的:

BaseFragment mProjects;
BaseFragment mProfile;

public BaseFragment getFragment(FragmentType type) {
        BaseFragment fr = null;
        switch (type) {
            case PROFILE:
                fr = new Profile();
                break;
            case PROJECTS:
                fr = new Projects();
                break;
            default:
                return null;
        }

        return fr;
    }
所以,我创建了一次可以从菜单访问的片段实例。好吗?还是我每次都要创造碎片?若有,那个么如何保存片段的状态(数据、位置)?原因当我使用片段管理器中的
replace
时,不会调用被替换片段的
onSaveInstanceState
。所以当我重新打开它时,没有保存状态

顺便说一句,我在活动中使用了
onSaveInstanceState

@Override
public void onSaveInstanceState(Bundle saveInstanceState) {

    // doing things
    super.onSaveInstanceState(saveInstanceState);
}
无论如何,如果我不存储指向片段
onSaveInstanceState
的链接,将永远不会调用片段的。所以,我可以在
onPause
方法中存储片段的状态,但这似乎是一个糟糕的解决方案


UPD:这不是基于意见的问题。应该有使用片段的最佳实践。所以我要了这个。

也许你在零碎的活动中犯了一个错误

也许您在FragmentActivity中重写onSaveInstanceState而不调用super.onSaveInstanceState(Bundle outState)

这将导致在片段中未调用方法**onSaveInstanceState**

更新
或者,当您想要显示新片段时,可以使用隐藏/显示而不是替换。。。隐藏的片段不会被删除

在替换当前显示的片段之前,您需要
getSupportFragmentManager()。putFragment(Bundle,String,fragment)
,这将把该片段存储到一个Bundle中,您可以保留对该片段的引用,并保存到活动的实例状态


getFragment
方法中,首先检查保存片段的捆绑包是否包含要创建的片段-
getSupportFragmentManager()。getFragment(捆绑包,字符串)
。这将为您提供一个可以返回和替换的片段。如果没有,请按当前状态创建片段的新实例。

@Override public void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(outState);//saving data}我说的是FragmentActivity,而不是片段本身的activity:@Override public void onSaveInstanceState(Bundle saveInstanceState){//smthng save super.onSaveInstanceState(saveInstanceState);}所以,如果你问这个问题…存储到片段的链接-糟糕的解决方案?为什么?它没有占用太多内存。但是为什么对Bundle的引用比直接引用片段更好?或者为什么它比片段的HashMap更好?FragmentManager保存一个活动片段数组,并将处理它们的状态。put和get方法只存储一个additint(片段的id)。保留您自己对片段的引用可能很容易失去同步,如果您再次尝试保存它们,则可能会使保存的实例状态数量翻倍。我尝试过。但对于我使用putFragment添加的所有键,它会生成相同的int值。这就是为什么它在getFragment中返回错误的值。。。