Android XR SDK kini tersedia di Pratinjau Developer. Kami ingin masukan dari Anda! Kunjungi
halaman dukungan kami untuk menghubungi kami.
Mengembangkan UI untuk Aplikasi Berbasis View Android
Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Coba cara Compose
Jetpack Compose menggunakan Jetpack XR SDK adalah toolkit UI yang direkomendasikan untuk Android XR.
Menggunakan framework Android Jetpack Compose adalah cara terbaik untuk memanfaatkan kemajuan terbaru dalam pengembangan UI Android dan untuk memverifikasi bahwa aplikasi Anda tetap sesuai dengan praktik terbaik industri.
Namun, jika Anda belum melakukan migrasi, dan sedang berupaya melakukan spasialisasi aplikasi berbasis Android
Views, ada beberapa pendekatan yang dapat Anda lakukan.
Menggunakan kembali View yang ada dalam SpatialPanels
Meskipun SpatialPanel
s adalah bagian dari library Jetpack Compose untuk XR, SpatialPanel
s juga menerima View. Saat menggunakan Subspace
di MainActivity, tempatkan tampilan yang ada ke dalam SpatialPanel
seperti yang ditunjukkan dalam contoh berikut.
setContent {
Subspace {
SpatialPanel(
modifier = SubspaceModifier.height(500.dp).width(500.dp).depth(25.dp)
) { MyCustomView(this@ActivityWithSubspaceContent) }
}
}
Menggunakan API interoperabilitas View Android dan Compose
Lihat panduan tentang interoperabilitas antara View dan Compose. Dokumentasi
ini membahas penggunaan framework ini bersama-sama dan berisi link ke contoh
kode yang dapat Anda gunakan.
Menggunakan ComposeView untuk menambahkan panel spasial dan pengorbit ke fragmen yang ada
Gunakan ComposeView
di tata letak XML untuk menambahkan Composable dan membuat konten XR baru. Gunakan View binding atau findViewById
untuk menemukan
ComposeView
dalam fungsi onCreateView()
.
Baca selengkapnya tentang panduan ComposeView
.
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val view = inflater.inflate(R.layout.example_fragment, container, false)
view.findViewById<ComposeView>(R.id.compose_view).apply {
// Dispose of the Composition when the view's LifecycleOwner
// is destroyed
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
// In Compose world
SpatialPanel(SubspaceModifier.height(500.dp).width(500.dp)) {
Text("Spatial Panel with Orbiter")
}
}
}
return view
}
Bekerja langsung dengan library Jetpack SceneCore
Compose untuk XR dibangun di atas Jetpack SceneCore. Jika Anda
melakukan spasialisasi aplikasi berbasis View, Anda dapat terus menggunakan kode UI yang ada
dalam Compose untuk XR atau memilih untuk bekerja langsung dengan
Session
Jetpack SceneCore.
Anda dapat membuat panel langsung dari SceneCore menggunakan PanelEntity
. Tetapkan
ukuran panel dalam meter menggunakan dimensions
, atau dalam piksel menggunakan
pixelDimensions
. Anda dapat memilih untuk membuat panel dapat dipindahkan atau diubah ukurannya
dengan menggunakan komponen yang sesuai. Untuk mengetahui informasi selengkapnya, lihat Menambahkan perilaku umum ke entitas.
val panelContent = MyCustomView(this)
val panelEntity = PanelEntity.create(
session = xrSession,
view = panelContent,
pixelDimensions = IntSize2d(500, 500),
name = "panel entity"
)
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2025-08-28 UTC.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Informasi yang saya butuhkan tidak ada","missingTheInformationINeed","thumb-down"],["Terlalu rumit/langkahnya terlalu banyak","tooComplicatedTooManySteps","thumb-down"],["Sudah usang","outOfDate","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Masalah kode / contoh","samplesCodeIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-08-28 UTC."],[],[],null,["Try the Compose way \nJetpack Compose using the Jetpack XR SDK is the recommended UI toolkit for Android XR. \n[Develop with the Jetpack XR SDK →](/develop/xr/jetpack-xr-sdk) \n\n\u003cbr /\u003e\n\nUsing the [Android Jetpack Compose framework](/jetpack/compose) is the best way to take\nadvantage of the latest advancements in Android UI development and to verify\nthat your application remains current with industry best practices.\n\nHowever, if you haven't migrated, and are working to spatialize an [Android\nViews](/develop/ui/views/layout/declaring-layout) based app, there are a few approaches you can take.\n\nReuse your existing Views within SpatialPanels\n\nWhile [`SpatialPanel`s](/reference/kotlin/androidx/xr/compose/subspace/package-summary#SpatialPanel(androidx.xr.compose.subspace.layout.SubspaceModifier,androidx.xr.compose.subspace.layout.SpatialShape,kotlin.Function0)) are part of the Jetpack Compose for XR library, they\nalso accept Views. When using [`Subspace`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#Subspace(kotlin.Function1)) in your MainActivity,\nplace an existing view into a [`SpatialPanel`](/reference/kotlin/androidx/xr/compose/subspace/package-summary#SpatialPanel(androidx.xr.compose.subspace.layout.SubspaceModifier,androidx.xr.compose.subspace.layout.SpatialShape,kotlin.Function0)) as shown in the following\nexample.\n\n\n```kotlin\nsetContent {\n Subspace {\n SpatialPanel(\n modifier = SubspaceModifier.height(500.dp).width(500.dp).depth(25.dp)\n ) { MyCustomView(this@ActivityWithSubspaceContent) }\n }\n}https://github.com/android/snippets/blob/7a0ebbee11495f628cf9d574f6b6069c2867232a/xr/src/main/java/com/example/xr/compose/Views.kt#L48-L54\n```\n\n\u003cbr /\u003e\n\nUse Android Views and Compose interoperability APIs\n\nConsult [guidance on interoperability between Views and Compose](/develop/ui/compose/migrate/interoperability-apis). This\ndocumentation covers using these frameworks together and contains links to code\nsamples you can use.\n\nUse a ComposeView to add spatial panels and orbiters to an existing fragment\n\nUse a [`ComposeView`](/reference/kotlin/androidx/compose/ui/platform/ComposeView) in your XML layout to add Composables and create new XR\ncontent. Use [View binding](/topic/libraries/view-binding) or [`findViewById`](/reference/android/view/View#findViewById(int)) to find the\n[`ComposeView`](/reference/kotlin/androidx/compose/ui/platform/ComposeView) in the [`onCreateView()`](/reference/android/app/Fragment#onCreateView(android.view.LayoutInflater,%20android.view.ViewGroup,%20android.os.Bundle)) function.\n\n[Read more about `ComposeView` guidance](/develop/ui/compose/migrate/interoperability-apis/compose-in-views#compose-in-fragments).\n\n\n```kotlin\noverride fun onCreateView(\n inflater: LayoutInflater,\n container: ViewGroup?,\n savedInstanceState: Bundle?\n): View {\n val view = inflater.inflate(R.layout.example_fragment, container, false)\n view.findViewById\u003cComposeView\u003e(R.id.compose_view).apply {\n // Dispose of the Composition when the view's LifecycleOwner\n // is destroyed\n setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)\n setContent {\n // In Compose world\n SpatialPanel(SubspaceModifier.height(500.dp).width(500.dp)) {\n Text(\"Spatial Panel with Orbiter\")\n }\n }\n }\n return view\n}https://github.com/android/snippets/blob/7a0ebbee11495f628cf9d574f6b6069c2867232a/xr/src/main/java/com/example/xr/compose/Views.kt#L61-L79\n```\n\n\u003cbr /\u003e\n\nWork directly with the Jetpack SceneCore library\n\n[Compose for XR](/develop/xr/jetpack-xr-sdk#jetpack-compose) is built on top of [Jetpack SceneCore](/develop/xr/jetpack-xr-sdk#jetpack-scenecore). If you are\nspatializing a Views based app, you may continue to use your existing UI code\nwithin Compose for XR or choose to work directly with Jetpack SceneCore's\n[`Session`](/reference/kotlin/androidx/xr/runtime/Session) instead.\n\nYou can build panels directly from SceneCore using [`PanelEntity`](/reference/kotlin/androidx/xr/scenecore/PanelEntity). Set the\nsize of the panel in meters using [`dimensions`](/reference/kotlin/androidx/xr/scenecore/PanelEntity#create(androidx.xr.runtime.Session,android.view.View,androidx.xr.runtime.math.FloatSize2d,kotlin.String,androidx.xr.runtime.math.Pose)), or in pixels using\n[`pixelDimensions`](/reference/kotlin/androidx/xr/scenecore/PanelEntity#create(androidx.xr.runtime.Session,android.view.View,androidx.xr.runtime.math.IntSize2d,kotlin.String,androidx.xr.runtime.math.Pose)). You can choose to make the panels movable or resizable\nby using the corresponding components. For more information, see [Add common\nbehavior to entities](/develop/xr/jetpack-xr-sdk/work-with-entities#add-common).\n\n\n```kotlin\nval panelContent = MyCustomView(this)\nval panelEntity = PanelEntity.create(\n session = xrSession,\n view = panelContent,\n pixelDimensions = IntSize2d(500, 500),\n name = \"panel entity\"\n)https://github.com/android/snippets/blob/7a0ebbee11495f628cf9d574f6b6069c2867232a/xr/src/main/java/com/example/xr/compose/Views.kt#L85-L91\n```\n\n\u003cbr /\u003e"]]