无法将视图添加到 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 的视图中
addChildViewController 方法仅用于将子视图控制器添加到 containerViewController?