嗨,我为找到解决方案付出了很多努力,并尝试了许多不同的解决方案(在Java
中),但没有一个对我有用,我的方法也与已经在{{1 }},这就是为什么我不得不再次问这个问题。
我会尽力解释一下我在做什么,
我有一个Stackoverflow
,其中一个MainActivity
包含5个BottomNavigationView
。
在其中一个(Fragments
中,我有一个ManageTasksFragment
,它有2个标签页(两个子片段)ViewPager
和ManageGivenFragment
,到目前为止,一切都很好。
ManageTasksFragment.kt
ManageDoingFragment
现在,我有一个名为private lateinit var tabLayout: TabLayout
private lateinit var viewPager: ViewPager
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_manage_tasks, container, false)
//val indicator = view.findViewById(R.id.tpi_header) as TabPageIndicator
tabLayout = view.findViewById(R.id.manage_tasks_tab_layout)
viewPager = view.findViewById(R.id.manage_tasks_view_pager)
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val sectionPageAdapter = SectionPageAdapter(childFragmentManager)
// Adding Fragments
sectionPageAdapter.addFragment(ManageGivenFragment(), "Given")
sectionPageAdapter.addFragment(ManageDoingFragment(), "Doing")
//adapter Setup
viewPager.adapter = sectionPageAdapter
tabLayout.setupWithViewPager(viewPager)
}
的新片段,它应该是ManageGivenDetailsFragment
的子片段,但是当我尝试替换该片段时,应用程序崩溃了,并且出现了错误
ManageGivenFragment
ManageGivenFragment.kt
java.lang.IllegalArgumentException: No view found for id 0x7f080032 (it.dobeedo.dobeedo:id/container) for fragment ManageGivenDetailsFragment
在上面的代码中,我同时尝试了override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val tasksArray = DataViewModel.instance.dataSource
//val openTasksArray = removeDoneTasks(tasksArray)
val recyclerView = view.findViewById<RecyclerView>(R.id.manage_given_tasks_recyclerView)
recyclerView.layoutManager = LinearLayoutManager(activity, LinearLayout.VERTICAL, false)
adapter = ManageGivenTasksAdapter(tasksArray, context!!) { item ->
val manageGivenTaskDetailsFragment = ManageGivenDetailsFragment()
//manageGivenTaskDetailsFragment.selectedTask = item
//fragmentManager?.beginTransaction()?.replace(R.id.container, manageGivenTaskDetailsFragment)?.addToBackStack(null)?.commit()
this.childFragmentManager?.beginTransaction()?.replace(R.id.container, manageGivenTaskDetailsFragment)?.commit()
}
recyclerView.adapter = adapter
}
和fragmentManager
。
ManageGivenDetailsFragment.kt
childFragmentManager
在上面的代码中,我尝试将override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_manage_given_details, null, false)
}
和null
用作container
的{{1}},因为有人建议将其更改为root
,但仍然没有不行。
如果您需要更多特定部分的代码,请告诉我,我们很高兴获得您的帮助。
更新
MainActivity.kt
inflater
更新2
activity_main.xml
null
答案 0 :(得分:1)
好的,所以我假设R.id.container
在mainactivity.java中
由于此管理分区无法到达,因此找不到任何视图。
this.childFragmentManager?.beginTransaction()?.replace(R.id.container, manageGivenTaskDetailsFragment)?.commit()
将R.id.container
替换为下面的
getActivity().findViewById(R.id.container).getId()
如果上述方法不起作用,请发布您的主要活动代码。
答案 1 :(得分:1)
您不能只是从此Fragment调用活动,而是替换
this.childFragmentManager
使用
activity?.supportFragmentManager
所以您应该拥有:
activity?.supportFragmentManager?.beginTransaction()?.replace(R.id.container, manageGivenTaskDetailsFragment)?.addToBackStack(null)?.commit()
这应该有效。
答案 2 :(得分:0)
可能是因为您在活动布局初始化之前尝试访问片段的视图,即在android中,一旦创建了活动,则只有我们才能访问其片段布局。因此,只需从onCreateView()中删除代码,然后将其复制到onActivityCreated(),如下所示。
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//make variable 'view' to global and access it
tabLayout = view.findViewById(R.id.manage_tasks_tab_layout)
viewPager = view.findViewById(R.id.manage_tasks_view_pager)
}