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

片段事务和片段创建

夏侯楷
2023-03-14
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_holder);
        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction().add(R.id.container, new Frag1(), "ZZZ").commit();
        }
    }
@Override
    public void bam(String s) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
        beginTransaction.replace(R.id.container, new Frag2());
        beginTransaction.addToBackStack(null);
        beginTransaction.commit();
    }

此时,Frag2在堆栈上,是唯一可见的片段。我使用了replace和addToBackStack,因为我需要后退导航。我的问题是,当我在Frag2内旋转屏幕时,活动中的super.oncreate(savedInstanceState)方法调用frag1的构造函数。

用户按下后退按钮之前,有没有什么方法可以避免调用Frag1的构造函数?

共有1个答案

雍志文
2023-03-14

您可以在清单文件中为活动设置属性,这样您的活动就不会在配置更改时被破坏,如下所示:

<activity
        android:name=".HomeActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:launchMode="singleTask"
        android:windowSoftInputMode="adjustPan|adjustResize" >
    </activity>

Android:configchanges=“KeyboardHiddenOrientationScreensize”;这些是属性。

或者,在添加或替换碎片时,可以通过匹配碎片的标记来进行交叉检查。为此,您需要编写如下所述的代码:

    getFragmentManager().beginTransaction().add(R.id.container, new Frag1(), "TAG NAME").commit();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_holder);
    fragment1 = getSupportFragmentManager().findFragmentByTag("TAG NAME");
    if(fragment1 == null) { //if fragment null, then add fragment        
        getFragmentManager().beginTransaction().add(R.id.container, new Frag1(), "TAG NAME").commit();
    }
}
 类似资料:
  • 我在我的一个活动中使用了Android设计支持库中的BottomNavigationView,以及每个导航项的片段。 每次我在栏上选择一个项目时,我都会进行一个片段交易,就像下面的片段一样(为了简洁起见,删除了代码的某些部分): 问题是...底部栏动画变得超级滞后,只有在片段完全加载并显示在屏幕上后才会完成。 这个问题并不完全是新问题,因为在使用导航菜单时也会发生,但至少可以通过使用抽屉布局来解决

  • 我查看了一些教程,了解片段之间的动画事务。我用这种方法制作动画,效果很好: 但是我想反转这个动画:旧片段滑出到左边,新片段滑入到右边,但是文件的值似乎对我的作用域没有用处。 我怎么能做到呢?

  • 我有一个,它创建一个,然后这个创建另一个: 这让我想到。是否真的可以删除并转到? 提前感谢您的时间,我在网上找不到任何合适的信息!

  • YQL(简化): 结果(简化): 如何告诉Vespa从“计算机”而不是“de”创建代码段?

  • MainActivity(扩展了fragmentActivity)有listview,它调用listviewadapter,其中有一个带有ViewpagerAdapter的ViewPager。现在,如果我需要在ViewPager中生成5个片段,如何将getFragmentManager()传递给适配器。 MainActivity[fragmentActivity]---->Listview----

  • 我使用FragmentActivity在片段之间切换。但我希望在片段上有一个管理按钮,当我单击它时,一个新的片段或活动看起来像一个孩子(在操作栏中有后退按钮)。 我怎样才能做到? 这是我的代码,可以使用,但“后退”按钮不会出现在操作栏中: 片段: 活动(目前……但如果需要,可能会出现碎片?): 也许我必须更改舱单中的某些内容?