当前位置: 首页 > 知识库问答 >
问题:

隐藏片段的生命周期

杨骁
2023-03-14

我想了解Android中活动生命周期和片段生命周期之间的相互作用,所以我决定启动一个新项目并从这个页面复制代码
然后我想,为了提高我的理解力,在平板电脑上测试它,改变它的方向,看看它发生了什么(尽管可能不是为了这个目的)。通过logcat,我跟踪在活动和国家/地区片段上触发的主要事件,例如在activity Oncreate中,我写道:

Log.d("TAG", "Activity: 1.onCreate");

这是我从纵向视图开始,然后旋转时得到的结果:

TAG:活动:1.on创建
TAG:活动:2.on开始
TAG:##ContryFrag:1.on附加
TAG:##ContryFrag:2.onCreateView
TAG:##ContryFrag:3.on开始
标签:活动:3.on简历
标签:##ContryFrag:4.on简历
标签:活动:-3.on暂停
标签:##ContryFrag:-4.on暂停
标签:活动:-2.on停止
标签:##ContryFrag:-3.on停止
标签:活动:-1.on销毁
标签:##ContryFrag:-2.on毁灭视图
标签:##ContryFrag:-<--PLHD--13/>Detach
TAG:活动:1.on创建
TAG:##ContryFrag:1.on附加
TAG:##ContryFrag:1.on附加
TAG:##ContryFrag:2.onCreateView
标签:活动:2.on开始
标签:##ContryFrag:2.onCreateView
标签:##ContryFrag:3. onStart
标签:##ContryFrag:3. onStart
标签:活动:3. onResume
标签:##ContryFrag:4. onResume
标签:##ContryFrag: 4. onResume

看起来,通过FragmentManager在纵向视图中添加的片段在旋转后仍然会重新创建,尽管它之前已分离。将再次跟踪要恢复的事件链,即使它不会显示<你能帮我了解这里发生了什么事吗?

编辑

当我检查片段是否为InLayout()时

Log.d("TAG", "## ContryFrag: 1.onAttach /" + isInLayout() );

我意识到旋转后有两个片段:一个是通过旋转创建的,另一个似乎是前一个活动的剩余部分(不应该是)。

TAG:活动:1.on创建
TAG:##ContryFrag:1.on附加 /false
TAG:##ContryFrag:1.on附加 /true
TAG:##ContryFrag:2.onCreateView /true
TAG:活动:2.on开始
标签:##ContryFrag:2.onCreateView /false
标签:##ContryFrag:3.on开始 /false
标签:##ContryFrag:3.on开始 /true
标签:活动:3.on简历
TAG:##ContryFrag:4.on简历 /false
TAG:##ContryFrag:4.on简历 /true

编辑2

这是我用来在SelectedCountry(字符串国家)上获取的伪代码,未提供:

public void onSelectedCountry(String country)
{
    String[] x = {country, "city0", "city1", "city2", "city3", "city4", "city5"};
    adapter.clear();
    adapter.addAll(x);
}

编辑3

这是我的密码。抱歉耽搁了,这是我第一次使用github。

共有3个答案

苗承
2023-03-14

链接的文章在布局xml中定义了片段。您在github中的代码正在按代码创建和添加片段。这两个你都用吗?

通奕
2023-03-14

看起来您没有使用片段的上一个实例。当活动由于配置更改而重新启动时,Android会保留碎片布局和相关的后栈。看起来,当活动的再创造发生时,一个新的片段被创建。尝试将以下代码添加到您的活动的on创建中:

@Override
public void onCreate(Bundle savedInstanceState) {

        ...    

    ContryFrag fragment = (ContryFrag) mFragmentManager.findFragmentById(R.id.fragment_container); 

    if (fragment == null) {
        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.fragment_container, new ContryFrag());
        fragmentTransaction.commit();
    }
}

并删除片段创建的代码。

翟柏
2023-03-14

片段添加到片段管理器后,它将一直保留在那里,直到手动删除它或直到活动永久完成。(重新启动活动,例如设备旋转时发生的情况不会导致其完成)

旋转设备不会清除碎片。如果您在生命周期中的任何时候创建一个新的片段并将其添加到FragmentManager中,而无需首先检查FragmentManager中是否已经存在FragmentManager,则您将只需在每次执行导致重新启动活动的操作时添加一个新的片段

例如,这段代码应该只允许添加片段的一个副本。

protected void onResume() {

    String TAG = "COUNTRYFRAG";

    CountryFrag f = (CountryFrag) getSupportFragmentManager().findFragmentByTag(TAG);

    if (f == null) {
        f = new CountryFrag();
        getSupportFragmentManager().beginTransaction()
                .add(f, TAG)
                .commit();
    }

    int count = getSupportFragmentManager().getFragments().size();
    Log.v("FRAGS", "There are " + count + "fragments in the fragment manager.");

}

而这一个将在每次旋转设备时添加一个新的。

protected void onResume() {

    String TAG = "COUNTRYFRAG";

        CountryFrag f = new CountryFrag();
        getSupportFragmentManager().beginTransaction()
                .add(f, TAG)
                .commit();

    int count = getSupportFragmentManager().getFragments().size();
    Log.v("FRAGS", "There are " + count + "fragments in the fragment manager.");

}

链接处的代码似乎正在使用SavedInstanceState的存在来确定是否要添加碎片或是否要从方法返回。这是不可靠的,因为你可能没有保存状态中的任何东西,因此它可能总是空的。最好特别检查一下你是否已经添加了碎片。

if (savedInstanceState != null) 
            return;
 类似资料:
  • 我正在使用以下方法通过显示/隐藏片段(在我的NavigationDrawer中)在片段之间切换。 我不清楚的是,当我显示或隐藏碎片生命周期的哪个方法被调用?(由于没有onShow()或onHide()这样的方法,我不太确定该使用什么)。我想在显示和隐藏某个片段时执行特定的操作。

  • 我有一段代码,调用startActivityForResult()从Android gallery中挑选图像。在调用startActivityForResult()和激活onActivityResult()时,我很难理解片段的生命周期。 “我的活动”检索信息并将其加载到listview。然后,它允许用户通过使用startActivityForResult()向照相机/多媒体资料应用程序发送意图,将

  • 在我的调试中,我注意到在片段上首先调用onpause/onstart/onstop/ondestroy,然后在它的活动上调用onResume,而onResume则相反--活动的onResume在它的片段之前首先调用。 为什么活动和片段之间的onpause/onstart/onstop与onResume的顺序不同?

  • 我在Nexus9上遇到了一个问题。(系统版本AndroidMarshmallow)在AndroidMarshmallow之前的Android系统上,当包含fragmentA的活动状态停止时,将调用fragmentA顶部回调。当包含fragmentA的活动状态被销毁时,将调用fragmentA回调onDestroyView、onDestroy和onDetach。官方网站上描述了这些过程 最近,我发现

  • 我从和组件跟踪生命周期方法的回调,我有很多问题。我需要你帮忙理解一些要点。 情景一: Lyfecycle: > 活动:onCreate 活动:onStart 片段:onAttach 片段:onCreate 片段:onCreateView 活动:onResume 片段:OnResume。 问题: 情况二: 与情况1类似,但现在和已加载,我按Home键: 活动:onpause 片段:onpause 活

  • 我有一个mainActivity承载一个ViewPager并包含三个选项卡(MQTT、ECO、Logger)。mainActivity具有生命周期回调(onCreat,onResume),其他三个选项卡具有片段的生命周期回调(onattached,onCreateView,onViewcreated,onResume,onPause)。 在运行时,我在logCat中收到以下信息: 当我从日志记录选