无法将视图添加到 ComposeView;仅支持撰写内容

Posted

技术标签:

【中文标题】无法将视图添加到 ComposeView;仅支持撰写内容【英文标题】:Cannot add views to ComposeView; only Compose content is supported 【发布时间】:2021-12-10 14:20:26 【问题描述】:

我正在尝试将 Jetpack Compose 可组合项添加到片段中的 xml 文件中。

当我尝试在设备上运行它时出现错误: Cannot add views to ComposeView; only Compose content is supported

片段:

class ComposeFragment : Fragment() 

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 
        val view = inflater.inflate(
            R.layout.activity_main, container, false
        )
        view.findViewById<ComposeView>(R.id.compose_view).setContent 
            Column(
                modifier = Modifier
                    .border(border = BorderStroke(1.dp, Color.Black))
                    .padding(16.dp)
            ) 

                Text("THIS IS A COMPOSABLE INSIDE THE FRAGMENT XML")
                Spacer(modifier = Modifier.padding(10.dp))
                CircularProgressIndicator()
                Spacer(modifier = Modifier.padding(10.dp))
                Text("NEAT")
                Spacer(modifier = Modifier.padding(10.dp))

            
        

        return view
    


activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <androidx.fragment.app.FragmentContainerView
        android:layout_
        android:layout_
        android:id="@+id/main_container"
        />

    <androidx.compose.ui.platform.ComposeView
        android:id="@+id/compose_view"
        android:layout_
        android:layout_
        />

</RelativeLayout>

MainActivity.kt:

open class MainActivity : AppCompatActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        supportFragmentManager.beginTransaction()
            .replace(R.id.compose_view, ComposeFragment())
            .commit()
    

我不确定这个错误是什么意思或如何解决它。我无法通过谷歌搜索在任何地方找到此错误。

【问题讨论】:

【参考方案1】:

在您的 MainActivity 中,您尝试将片段放入 ComposeView(仅需要 Composable)。

你应该为你的 Fragment 指定正确的容器:

supportFragmentManager.beginTransaction()
        .replace(R.id.main_container, ComposeFragment())
        .commit()

【讨论】:

【参考方案2】:

replace(R.id.compose_view, ComposeFragment()) 将片段添加到您的 ComposeView,而不是您的 FragmentContainerView - 这就是将 View 添加到您的 ComposeView 的原因。

如果您想将 Fragment 添加到您的 FragmentContainerView,您需要使用 FragmentContainerView 的 ID:

open class MainActivity : AppCompatActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        // Always surround any FragmentTransactions in a
        // savedInstanceState == null since fragment are
        // automatically restored and you don't want to replace
        // those restored fragments
        if (savedInstanceState == null) 
            supportFragmentManager.beginTransaction()
                .replace(R.id.main_container, ComposeFragment())
                .commit()
        
    

尚不清楚为什么您的 Activity 正在膨胀 activity_main 并且您的 Fragment 也在膨胀 activity_main - 这些应该是不同的布局,您应该选择是否希望您的 Activity 的布局仅托管一个片段(从而删除ComposeView 来自其布局)并让片段包含您的ComposeView,或者如果您想完全跳过片段并直接在您的活动中使用您的ComposeView。两者都做(特别是在你的布局中,由于你使用RelativeLayout,它们会相互重叠)没有多大意义。

【讨论】:

好的。我想我从根本上误解了这些事情是如何运作的。我不明白这三种一起工作,无论您放置片段容器的任何地方都是视图结束的地方。谢谢你们的cmets!

以上是关于无法将视图添加到 ComposeView;仅支持撰写内容的主要内容,如果未能解决你的问题,请参考以下文章

InputMethodService 与 Jetpack Compose - ComposeView 导致:组合到不传播 ViewTreeLifecycleOwner 的视图中

向仅 Rails api 的应用程序添加对渲染视图的支持

滚动视图无法执行委托,但表视图可以

addChildViewController 方法仅用于将子视图控制器添加到 containerViewController?

将项目添加到另一个活动中的列表视图(仅添加 1 个条目)

如何通过仅膨胀一次将相同的视图多次添加到父级