我想知道这是否是Android API中的一个错误:
我有这样的设置:
?----?---------?
|    |         |
|  1 |    2    |
|    |?-------?|
|    ||       ||
|    ||   3   ||
?----??-------??
此功能在手机上非常有效(其中1和2和3为ActivityFragments).
但是,当我使用此代码时:
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();       
    Fragment frag = new FragmentNumber2();
    if(toLoad != null) frag.setArguments(toLoad);
    transaction.replace(R.id.rightPane, frag);      
    transaction.commit();
其中R.id.leftPane和R.id.rightPane是<fragment>S IN水平线性布局.
据我所知,上面的代码删除了驻留的片段,然后用新的片段替换它.很棒......显然不会发生这种情况,因为当第二次运行此代码时会出现以下异常:
07-27 15:22:55.940: ERROR/AndroidRuntime(8105): Caused by: java.lang.IllegalArgumentException: Binary XML file line #57: Duplicate id 0x7f080024, tag null, or parent id 0x0 with another fragment for FragmentNumber3
这是因为FragmentNumber3的容器已被复制,并且它不再具有唯一ID.在添加新的片段之前,初始片段没有被销毁(?)(在我看来,这意味着它还没有被 …
我正在为4.0和4.1平板电脑编写一个应用程序,我不想使用支持库(如果不需要),而只使用4.x api.
所以我的目标平台定义为:> = 4.0且<= 4.1
该应用程序具有多窗格布局(两个片段,左侧一个小片段,右侧一个内容片段)和一个带标签的操作栏.
与此类似:

单击操作栏上的选项卡可更改"外部"片段,然后内部片段是具有两个嵌套片段的片段(1.左侧小片段,2.宽内容片段).
我现在想知道替换片段,特别是嵌套片段的最佳做法是什么.ViewPager是支持库的一部分,此类没有本机4.x替代方案.在我看来似乎是"弃用".- http://developer.android.com/reference/android/support/v4/view/ViewPager.html
然后我阅读了Android 4.2的发行说明ChildFragmentManager,这是一个不错的选择,但我的目标是4.0和4.1,所以这也不能使用.
ChildFragmentManager 仅适用于4.2
遗憾的是,即使在整个Android开发人员指南中,也没有任何好的示例显示没有支持库的片段使用的最佳实践; 尤其是关于嵌套片段的一切.
所以我想知道:如果不使用支持库及其附带的所有内容,是否根本不可能使用嵌套片段编写4.1应用程序?(需要使用FragmentActivity而不是Fragment等?) 或者什么是最佳实践?
我目前在开发中遇到的问题正是这个陈述:
Android支持库现在还支持嵌套片段,因此您可以在Android 1.6及更高版本上实现嵌套片段设计.
注意:当布局包含a时,您无法将布局扩展为片段
<fragment>.仅在动态添加到片段时才支持嵌套片段.
因为我在XML中定义了嵌套片段,这显然会导致如下错误:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_
目前,我为自己总结一下:即使在4.1上,当我甚至不想以2.x平台为目标时,如果没有支持库,则无法在屏幕截图中显示嵌套片段.
(这实际上可能更像是一个wiki条目而不是一个问题,但也许其他人之前已经管理过它).
更新:
一个有用的答案是:Fragment Inside Fragment
android android-fragments android-support-library android-nested-fragment
是否有可能坚持Fragment另一个的布局Fragment?有没人试过这个?
我最近学会了如何在Android中制作嵌套片段.不过,我不知道应该如何进行沟通.
从阅读片段通信文档我知道
所有Fragment-to-Fragment通信都是通过相关的Activity完成的.两个碎片永远不应该直接通信.
这对于活动中的兄弟片段是有意义的,但它对于父子片段通信没有多大意义.我是否需要一直到活动只是为了让Child Fragment与Parent Fragment交谈?如果答案是简单的"是"那么我就可以做到.如果它是"否",那么代码设计会是什么样子?
我在Nested Fragment文档中看到,可以使用它getParentFragment()来获取对父片段的引用.这是否意味着孩子应该直接与父母沟通?这似乎与通过与父活动进行通信的正常片段所鼓励的相反.
Back Stack是否支持与Android中嵌套片段的交互?
如果是的话,我做错了什么?在我的实现中,后退按钮完全忽略了我将此事务添加到后台堆栈的事实.我希望它不是因为嵌套片段的问题,而是我做错了什么.
以下代码位于我的一个片段中,用于将新片段与当前显示的任何嵌套片段交换:
     MyFragment fragment = new MyFragment();
     FragmentTransaction ft = getChildFragmentManager().beginTransaction();
     ft.setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_left, R.animator.slide_in_from_left, R.animator.slide_out_right);
     ft.addToBackStack(null);
     ft.replace(R.id.myFragmentHolder, fragment);
     ft.commit();
在我的应用程序中,我有一个BottomNavigation来自 Material design的主屏幕。从这些屏幕中,我希望能够启动BottomNavigation隐藏的其他片段,以便新片段填满整个屏幕。然后应该可以通过后退箭头返回。我想你们都可以想象这一点,因为这是今天非常普遍的模式。
为了实现这一点,我想使用带有单个活动设计的导航组件。我的想法是,我的 MainActivity 只包含一个,NavHostFragment而 BottomNavFragment 包含另一个NavHostFragment以及BottomNavigation。由于隐藏的可能性,我无法移动
BottomNavigation到 MainActivity 布局。
这对我来说似乎有点奇怪。我真的需要两个导航图和两个NavHostFragments吗?的NavHostFragment在BottomNavFragment仅具有目的,以显示与相关联的相关片段BottomNavigation。要导航到其他片段,我必须使用NavHostFragment来自活动的 。如果我使用相同的导航图,它会与开始导航相冲突,从而导致无休止的递归。
或者我应该DialogFragments对我想开始的其他片段使用全屏吗?如果是这样,我如何告诉导航组件以全屏对话框的形式启动对话框?谷歌有推荐的方法来做到这一点吗?
android android-fragments android-bottomnav android-architecture-navigation
此代码:在其中我要添加片段的地方打开bottomSheetDialogFragment。
我想在bottomsheetDialogFragment中添加多个片段,但是会抛出
java.lang.IllegalArgumentException:找不到ID为0x7f0a01cb的视图
class AddNotesBottomSheetDialog : BottomSheetDialogFragment() {
private lateinit var bottomSheetDialog: BottomSheetDialog
private lateinit var bottomSheetBehavior: BottomSheetBehavior<View>
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    Log.v(LOG_TAG, "-> onCreateDialog")
    bottomSheetDialog = BottomSheetDialog(context!!)
    var view = View.inflate(context, R.layout.bottom_sheet_notes, null)
    bindViews(view)
    bottomSheetDialog.setContentView(view)
    bottomSheetBehavior = BottomSheetBehavior.from(view.parent as View)
    bottomSheetBehavior.isHideable = false
    bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
    return bottomSheetDialog
}
private fun bindViews(view: View) {
    loadAddNotesFragments()
}
override fun onStart() {
    super.onStart()
    Log.v(LOG_TAG, "-> onStart")
    bottomSheetBehavior.isHideable = false
    bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
    if (!visible)
        dialog.hide()
}
fun show(fragmentManager: FragmentManager) …