繁体   English   中英

获取 Android 片段找不到 ID 的视图

[英]Getting Android Fragment no view found for ID

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

我的意思是像这里提供的解决方案:

Android 片段找不到 ID 的视图?

和这里:

Android 片段:未找到 id 0x7f040034 的视图

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

首先,我在我的片段中设置这样的布局:

 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>

创建视图后,我可以调用此方法:

final Fragment thisFragment=this;
KotlinClass.Companion.setCalendarViewdateListener(calendarView,thisFragment,R.id.principal);

在 KotlinClass 的那个方法中,我可以调用这个 function:

setFragment(FichajesFragment(), fragment,"Fichajes",id);

作为参数片段,thisFragment 传递给 setCalendarViewdateListener function。

我终于像这样定义了 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 找到视图,指的是线性布局的主体 id。

我错过了什么?

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

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

 val fragmentManager: FragmentManager = fragment2.activity!!.getSupportFragmentManager();
 val fragmentTransaction = fragmentManager.beginTransaction()
 for (activeFragment in fragmentManager.fragments) {
          fragmentTransaction.remove(activeFragment)
 }

fragmentManager中,您存储了属于托管 fragment2 的活动的fragment2 ,在您的情况下,该片段的布局包括带有@+id/principal id 的 Linearlayout。 然后在您的for循环中,您删除了该 fragmentManager 管理的所有fragmentManager ,这意味着您也从中删除了fragment2 因此,当您稍后致电时:

fragmentTransaction.add(id, fragment, tag)

它找不到任何 ID 为@+id/principal的视图,因为包含该 Linearlayout ( fragment2 ) 的片段刚刚被删除。

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

val fragmentManager: FragmentManager = fragment2.childFragmentManager

还有一点需要注意:我对R.layout.activity_calendario_laboral感到困惑,但如果我理解正确,布局实际上是针对片段的,所以你知道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM