使用fragmenttransaction添加嵌套片段时,不能唯一地标识布局

我正在尝试执行以下操作:

  1. 在活动中, 容器替换为一个片段(TestFragment)
  2. 这个片段的布局包含一个被另一个片段(TestSubFragment) 替换的容器,
  3. 单击TestSubFragment使活动在根容器上添加一个新的TestFragment

TestActivity.kt

class TestActivity : AppCompatActivity(), TestSubFragment.OnFragmentInteractionListener { override fun onFragmentInteraction(id: Int) { supportFragmentManager.beginTransaction().add(R.id.container, TestFragment.newInstance(id)).addToBackStack(null).commit() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_test) supportFragmentManager.beginTransaction().replace(R.id.container, TestFragment.newInstance(1)).addToBackStack(null).commit() } } 

TestFragment.kt

 class TestFragment : Fragment() { private var id: Int? = null override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { val v = inflater!!.inflate(R.layout.fragment_test, container, false) activity.supportFragmentManager.beginTransaction().replace(R.id.sub_fragment_container, TestSubFragment.newInstance(id!!)).commit() return v } companion object { fun newInstance(id: Int): TestFragment { val fragment = TestFragment() fragment.id = id return fragment } } } 

TestSubFragment.kt

 class TestSubFragment : Fragment() { private var mListener: OnFragmentInteractionListener? = null private var id: Int? = null override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { val v = inflater!!.inflate(R.layout.fragment_sub_test, container, false) v.id_text.text = id.toString() v.id_text.setOnClickListener { _ -> mListener?.onFragmentInteraction(v.id_text.text.toString().toInt() + 1) } return v } override fun onAttach(context: Context?) { super.onAttach(context) if (context is OnFragmentInteractionListener) { mListener = context } } interface OnFragmentInteractionListener { fun onFragmentInteraction(id: Int) } companion object { fun newInstance(id: Int): TestSubFragment { val fragment = TestSubFragment() fragment.id = id return fragment } } } 

activity_test.xml

      

fragment_test.xml

     

fragment_sub_test.xml

    

问题是TestFragment.kt中的替换片段行是从xml层次结构中find第一个R.id.sub_fragment_container,因此它将替换错误的容器而不是最后一个/新的容器。

我尝试在fragmenttransaction中添加标签或将R.id.sub_fragment_container更改为v.sub_fragment_container.id,但没有运气。

我不想更改onFragmentInteraction中的add()替换(),因为片段将被重新创建,并且我想在用户返回片段时保持片段中的所有内容不变。

我无法find关于我的情况下嵌套碎片的详细的文章。

我正在和Kotlin一起工作,但是我也可以理解Java。 谢谢!

我解决了我的问题,没有得到新的容器ID。

我决定删除fragmenttransaction并在xml中添加片段。 然后在包含子片段的片段(父片段)中,使用childFragmentManager.findFragmentById(R.id.fragment)获取子片段。 最后从父代片段更新子片段的内容。

 class TestActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_test) val fragment1 = TestFragment.newInstance(1) supportFragmentManager.beginTransaction().replace(R.id.container, fragment1).commit() val fragment2 = TestFragment.newInstance(2) supportFragmentManager.beginTransaction().add(R.id.container, fragment2).addToBackStack(null).commit() val fragment3 = TestFragment.newInstance(3) supportFragmentManager.beginTransaction().add(R.id.container, fragment3).addToBackStack(null).commit() } } class TestFragment : Fragment() { private var id: Int? = null override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { val v = inflater!!.inflate(R.layout.fragment_test, container, false) val subFragment = childFragmentManager.findFragmentById(R.id.fragment) as TestSubFragment subFragment.view?.findViewById(R.id.id_text)?.text = id.toString() return v } companion object { fun newInstance(id: Int): TestFragment { val fragment = TestFragment() fragment.id = id return fragment } } } class TestSubFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater!!.inflate(R.layout.fragment_sub_test, container, false) } } 

activity_test.xml

      

fragment_test.xml

    

fragment_sub_test.xml