Articles of fragmenttransaction

Android FragmentTransaction.addToBackStack混乱

我正在研究片段,并且很难区分FragmentTransaction.replace(id, fragment, tag)和FragmentTransaction.addToBackStack(tag)调用。 让我们说我当前的片段是FragmentA然后我加载了FragmentB 。 我希望将来,当我需要加载FragmentA时 ,我不必重新加载它。 只需在旧状态下加载旧的。 我使用了以下代码段: public void loadFragment(Fragment fragmentB, String tag) { FragmentManager fm = getSupportFragmentManager(); View fragmentContainer = findViewById(R.id.fragment_container); FragmentTransaction ft = fm.beginTransaction(); ft.replace(fragmentContainer.getId(), fragmentB, tag); ft.addToBackStack(tag); ft.commit(); } 现在我很困惑,我应该在哪里添加字符串标签? 在replace()或addToBackStack()或两个调用中? 你能解释这两个标签位置之间的区别吗?

android.R.id.content作为Fragment的容器

我的情况是活动A,其中包含片段B.我总是像这样实现它。 活动A的布局: 片段B的布局: 这很好用,但是如果我们打开Android设备监视器并查看View Hierarchy: 所以,我不喜欢在我的层次结构中有两个相同无用的FrameLayouts,我可以剪切我的R.id.container。 我是这样做的: 我的Activity A中的onCreate(Bundle args)实现: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction() .add(android.R.id.content, FragmentB.newInstance()).commit(); } 我只是没有为我的Activity设置内容并将我的Fragment B附加到系统容器android.R.id.content。 这对我很有用。 我删除了一个无用的包含。 我的问题是做这个“黑客”的好习惯。 在任何情况下它都会崩溃我的应用程序吗?这个实现后我可以遇到什么问题? 可能有人在这个问题上有实际经验吗? 感谢所有人的好答案。

是否可以在片段事务中添加ToBackStack并替换?

有关以下代码的任何想法? 在我的测试中,我发现被替换的片段没有被破坏,当popup后栈时实例仍然存在。 只是想validation这是使用片段事务的有效方法。 getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(frame, fragmentB).commit(); 我使用替换的原因是它导致替换的片段运行它的退出animation。

替换片段具有错误的高程值

你好再次堆栈溢出。 我有另一个片段问题。 (我正在使用android.app.Fragment而不支持片段) 我正在尝试更换片段。 但这不像使用那么简单: fragmentTransaction .replace(containerId, newFragment) .addToBackStack(“unique tag”) .commit() 为什么不? 好朋友,这是因为我的newFragment有一个过渡animation。 animation在哪里定义? 另一个很棒的问题,它在片段onCreateAnimator()中定义 为什么在那里定义? 可以find原因的长答案: 嵌套片段转换不正确 。 现在你需要相信这就是我的项目需要做的事情。 animation是做什么的? 从屏幕边缘到其中心的简单滚动,完全覆盖原始片段。 请记住,在这种情况下,旧片段只是坐在原地。 它具有不移动的animation效果。 问题是什么? 问题是newFragment似乎比旧版本具有更低的高程(或z?)值。 因此,无法观察到过渡,因为旧片段位于新片段上方。 到达animation持续时间结束时,您会看到新片段在旧片段上方闪烁。 我期望newFragment从animation开始就覆盖旧版本。 为什么不使用添加? 这似乎会产生更多问题,因为我有很多片段要交换进出视图。 使用add似乎会在下次使用replace时触发它们的退出animation,即使前面有1 … n个片段。 他们也不会停顿。 为什么不设置高程? 因为我支持没有提升属性的api 19。 为什么不对api 19使用ViewCompat.setElevation()? 我尝试了它并且有相同的失败结果。 有没有人find解决这个问题的方法?

嵌套片段转换不正确

你好堆栈溢出的程序员! 我已经度过了这个问题的好一周,现在我非常渴望一个解决方案。 场景 我正在使用android.app.Fragment,不要与支持片段混淆。 我有6个子片段命名为: FragmentOne FragmentTwo FragmentThree FragmentA FragmentB FragmentC 我有2个父片段命名: FragmentNumeric FragmentAlpha 我有1个活动名为: MainActivity 他们的行为如下: 子片段是仅显示视图的片段,它们不显示也不包含片段。 父片段使用单个子片段填充其整个视图。 他们能够用其他子片段替换子片段。 该活动使用父片段填充其大部分视图。 它可以用其他父片段替换它。 因此,在任何时候屏幕都只显示一个子片段。 你可能已经猜到了, FragmentNumeric显示子片段FragmentOne , FragmentTwo和FragmentThree 。 FragmentAlpha显示子片段FragmentA , FragmentB和FragmentC 。 问题 我正在尝试过渡/animation父母和子女片段。 儿童片段按预期顺利过渡。 但是,当我转换到新的父片段时,它看起来很糟糕。 子片段看起来像是从其父片段运行独立的过渡。 并且子片段看起来也像是从父片段中移除的。 可以在这里查看它的gif https://imgur.com/kOAotvk 。 注意单击Show Alpha时会发生什么。 我能find的最接近的问题和答案是: 嵌套片段在转换animation期间消失,但所有答案都不满意。 animationXML文件 我有以下animation效果(持续时间很长,用于测试目的): fragment_enter.xml fragment_exit.xml fragment_pop.xml fragment_push.xml fragment_nothing.xml MainActivity.kt 需要考虑的事项:第一个父片段FragmentNumeric没有输入效果,所以它总是准备好活动,并且没有退出效果,因为没有任何东西正在退出。 我也在使用FragmentTransaction#add […]

点击片段后面的隐形布局:

我创建了几个片段,然后按以下方式添加第一个片段: mainFragment = (MainFragment) MainFragment.create(); getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right) .add(R.id.content, mainFragment, MAIN_FRAGMENT_TAG) .commit(); 第二个片段以这种方式添加: getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right) //.hide(mainFragment) .add(R.id.content,VenueFragment.create(vid), “Venue Fragment”) .addToBackStack(null) .commit(); setDrawerIndicatorEnabled(false); 现在你看到hide方法没有应用于这个事务,并且VenueFragment被打开了,这种情况下的问题是当VenueFragment打开时(并且它是一个全屏视图)按下这个片段的空部分会调用MainFragment可点击的视图。 我怎么能阻止这个? 如果我使用hide选项,那么它不会发生但是由于某种原因,用于移除MainFragment的animation正在上升并且这会产生奇怪的体验。

已经调用了Android FragmentTransaction提交

我的错误: java.lang.IllegalStateException:已经调用了commit 我的代码: final FragmentTransaction fragmentTransaction =getFragmentManager().beginTransaction(); f1_fragment = new F1_Fragments(); f2_fragment = new F2_Fragments(); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { parent.getItemAtPosition(position); if(position==0){ fragmentTransaction.replace(android.R.id.content, f1_fragment); }else{ fragmentTransaction.replace(android.R.id.content, f2_fragment); } fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } });

何时使用FragmentTransaction的attach和detach方法

我刚刚浏览了FragmentTransaction的attach()和detach()方法的文档: attach() :在先前使用detach(Fragment)从UI detach(Fragment)之后重新附加片段。 这会导致其视图层次结构被重新创建,附加到UI并显示。 嗯,这是什么意思? 更具体地说,我看到了一个例子: mMapFragment = new MapFragment(); ft.beginTransaction(mMapFragment) .attach() .add(R.id.container, mMapFragment) .commit(); 我删除了attach()并再次尝试:我没有发现任何差异。 attach在这个例子中做了什么? 与此相比有什么不同: ft.beginTransaction() .add(R.id.container, mMapFragment) .commit(); 如果上面的例子不足以显示差异……我只想知道我们何时需要显式调用attach()和detach() ? 如果你可以解释添加/删除/替换方面的差异会更好。

AppCompat操作栏库不显示添加的片段

编辑 :如果我扩展FragmentActivity而不是ActionBarActivity我的布局再次出现(当然没有一个ActionBar )。 ActionBar在4.x设备上按预期工作,但在我的2.3设备上,我所得到的是ActionBar和它下面的空白屏幕 。 Fragment似乎没有被添加到Activity 。 的themes.xml <style name="AppTheme" parent="AppBaseTheme"> <item name="actionBarStyle">@style/Widget.ActionBar</item> </style> 主题-v11.xml <style name="AppTheme" parent="AppBaseTheme"> <item name="android:actionBarStyle">@style/Widget.ActionBar</item> </style> styles.xml <style name="Widget.ActionBar" parent="@style/Widget.AppCompat.ActionBar"> <item name="android:background">@color/actionbar_background</item> <item name="background">@color/actionbar_background</item> </style> Activity onCreate() FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); myFragment = new WallFragment(); fragmentTransaction.add(android.R.id.content, myFragment, myFragment.FRAGMENT_TAG); fragmentTransaction.commit(); 我正在使用Gradle将AppCompat ActionBar库包含在我的应用程序中。 compile 'com.android.support:appcompat-v7:18.0.+'

FragmentManager.getFragmens()。size()不会减lessFragmentTransaction.remove(Fragment)

经过一段时间寻找我的NPE的原因,我注意到,尽pipeFragmentTransaction.remove(片段)真的删除片段,由FragmentManager.getFragments()返回的列表的大小仍然相同。 该屏幕截图显示了删除片段后此方法返回的内容: http://img.androidcookie.com/android/erro fm.PNG 该列表有3个片段,为什么大小仍然是4?