【问题标题】:Cannot add views to ComposeView; only Compose content is supported无法将视图添加到 ComposeView;仅支持撰写内容
【发布时间】: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_width="match_parent"
    android:layout_height="match_parent">

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

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

</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()
    }
}

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

【问题讨论】:

    标签: android xml kotlin android-jetpack-compose


    【解决方案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!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-25
      • 2022-01-20
      • 2018-05-31
      • 1970-01-01
      • 2011-09-09
      • 2014-09-10
      • 1970-01-01
      相关资源
      最近更新 更多