Java 获取Android片段未找到ID的视图

Java 获取Android片段未找到ID的视图,java,android,kotlin,android-fragments,Java,Android,Kotlin,Android Fragments,首先,我检查了这个问题是否已经完成,并测试了这个站点上解释的解决方案(尽管我可能在执行这些问题时犯了错误,因为有太多可能的错误原因) 我指的是这里提供的解决方案: 在这里: 所以,我在解释我的特殊情况 首先,我在片段中设置如下布局: public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

首先,我检查了这个问题是否已经完成,并测试了这个站点上解释的解决方案(尽管我可能在执行这些问题时犯了错误,因为有太多可能的错误原因)

我指的是这里提供的解决方案:

在这里:

所以,我在解释我的特殊情况

首先,我在片段中设置如下布局:

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        root = inflater.inflate(R.layout.activity_calendario_laboral, container, false);
        return root;
    }
该布局总结如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/principal">
[...]
</LinearLayout>
</FrameLayout>
在KotlinClass的方法中,我可以调用此函数:

setFragment(FichajesFragment(), fragment,"Fichajes",id);
作为传递给setCalendarViewdateListener函数的thisFragment的参数片段

我终于这样定义了setFragment:

private fun setFragment(fragment: Fragment, fragment2: Fragment, tag: String, id: Int) {
                    val fragmentManager: FragmentManager = fragment2.activity!!.getSupportFragmentManager();
 val fragmentTransaction = fragmentManager.beginTransaction()
 for (activeFragment in fragmentManager.fragments) {
          fragmentTransaction.remove(activeFragment)
 }
 fragmentTransaction.add(id, fragment, tag)
 fragmentTransaction.commit()
 fragmentManager.executePendingTransactions()
 
}
它在执行fragmentManager.executePendingTransactions()时引发异常,告知找不到id的视图,请参考linearlayout的主体id


我缺少什么?

如果我理解正确,我认为在布局文件中必须指定参数:
tools:context=“.FragmentName”

我注意到了几个问题,但你的应用程序崩溃的主要原因是这一部分:

 val fragmentManager: FragmentManager = fragment2.activity!!.getSupportFragmentManager();
 val fragmentTransaction = fragmentManager.beginTransaction()
 for (activeFragment in fragmentManager.fragments) {
          fragmentTransaction.remove(activeFragment)
 }
fragmentManager
中,您存储了属于托管
fragment2
的活动的fragmentManager,在您的情况下,片段的布局包括带有
@+id/principal
id的线性布局。然后在
for
循环中,您删除了由
fragmentManager
管理的所有片段,这意味着您也从中删除了
fragment2
。因此,当您稍后打电话时:

fragmentTransaction.add(id, fragment, tag)
它找不到id为
@+id/principal
的任何视图,因为刚刚删除了包含该Linearlayout(
fragment2
)的片段

因此,要使代码正常工作,请删除
for
循环,这样应用程序就不会再崩溃。但是从代码示例的外观来看,我假设您希望将
FichajesFragment
添加为
fragment2
的一部分,在这种情况下,您使用了错误的
fragmentManager
;您应该使用属于
片段2
的活动,而不是活动1,即:

val fragmentManager: FragmentManager = fragment2.childFragmentManager
还有一点需要注意:我被
R.layout.activity\u calendario\u laboral
弄糊涂了,但是如果我理解正确的话,布局实际上是针对片段的,所以请大家知道

val fragmentManager: FragmentManager = fragment2.childFragmentManager