是否可以在同一活动中同时使用 Android jetpack Compose 视图和 xml 文件?

Is it possible to use both Android jetpack Compose views and xml files together in same Activity?

提问人:KZoNE 提问时间:11/12/2023 更新时间:11/16/2023 访问量:50

问:

我在 Android 应用程序中遇到一个问题,即我无法在我的 ComponentActivity 子类中使用 supportFragmentManager。根据我的理解,ComponentActivity 不支持开箱即用的 FragmentManager。如果我想使用 supportFragmentManager 活动应该是 AppCompatActivity 或 FragmentActivity 的子类。但是,我遇到了一个似乎不可用的问题。我想在我的课堂上同时使用 JetPack Compose 和 XML

我遵循了这个 https://stackoverflow.com/a/65653754/3467187

class AbcActivity : ComponentActivity(n) {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_permissio)
    if (savedInstanceState == null) {
         // Here I want to use supposrtFragmentManger
    }
}

}

Gradle 文件看起来像这样,

dependencies {

implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
implementation("androidx.activity:activity-compose:1.8.0")
..
}

有没有想过在同一个类中使用 JetPack Compose 和 XML,就像我可以使用片段管理器一样?

人造人 科特林 android-jetpack-compose 安卓喷气背包 fragmentmanager

评论


答:

0赞 ItzDavi 11/16/2023 #1

是的,您可以在 XML 中使用 Compose,也可以反过来使用。

这个答案。

方法 1

1. 添加 XMLComposeView

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

2. 设置活动中的内容

findViewById<ComposeView>(R.id.my_composable).setContent {
    MaterialTheme {
        Surface {
          Text(text = "Hello!")
        }
    }
}

方法 2

您可以使用 .AndroidViewBinding

在继续使用此方法之前,请阅读内容

@Composable
fun AndroidViewBindingExample() {
    AndroidViewBinding(ExampleLayoutBinding::inflate) {
        exampleView.setBackgroundColor(Color.GRAY)
    }
}

Compose 中的 XML

AndroidView(
    factory = { context ->
        val view = LayoutInflater.from(context).inflate(R.layout.my_layout, null, false)
        val textView = view.findViewById<TextView>(R.id.text)

        // do whatever you want...
        view // return the view
      },
    update = { view ->
    // Update the view
  }
)