Görüntülemeye dayalı tasarım kullanan mevcut bir uygulamaya Oluşturmaya dayalı kullanıcı arayüzü ekleyebilirsiniz.
Tamamen Compose tabanlı yeni bir ekran oluşturmak için etkinliğinizin setContent()
yöntemini çağırmasını sağlayın ve istediğiniz tüm derlenebilir işlevleri iletin.
class ExampleActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { // In here, we can call composables! MaterialTheme { Greeting(name = "compose") } } } } @Composable fun Greeting(name: String) { Text(text = "Hello $name!") }
Bu kod, yalnızca Oluştur modunda çalışan bir uygulamada bulacağınız koda benzer.
ComposeView
için ViewCompositionStrategy
ViewCompositionStrategy
, kompozisyonun ne zaman kaldırılacağını tanımlar. Varsayılan değer olan ViewCompositionStrategy.Default
, RecyclerView
gibi bir havuzlama kapsayıcısının parçası olmadığı sürece, temel ComposeView
pencereden ayrıldığında kompozisyonu kaldırır. Yalnızca tek Etkinlikli Yazma türündeki bir uygulamada bu varsayılan davranış tercih edilir. Ancak, kod tabanınıza kademeli olarak Compose'u ekliyorsanız bu davranış bazı senaryolarda durum kaybına neden olabilir.
ViewCompositionStrategy
değerini değiştirmek için setViewCompositionStrategy()
yöntemini çağırın ve farklı bir strateji sağlayın.
Aşağıdaki tabloda, ViewCompositionStrategy
'ü kullanabileceğiniz farklı senaryolar özetlenmiştir:
ViewCompositionStrategy |
Açıklama ve birlikte çalışabilirlik senaryosu |
---|---|
DisposeOnDetachedFromWindow |
Temel ComposeView pencereden kaldırıldığında kompozisyon kullanımdan kaldırılır. O zamandan beri DisposeOnDetachedFromWindowOrReleasedFromPool ile değiştirildi.Birlikte çalışabilirlik senaryosu: * ComposeView Görünüm hiyerarşisindeki tek öğe mi yoksa karma bir Görünüm/Oluştur ekranı bağlamında mı (Fragment'te değil)? |
DisposeOnDetachedFromWindowOrReleasedFromPool (Varsayılan) |
Beste, RecyclerView gibi bir havuzlama kapsayıcısında olmadığında DisposeOnDetachedFromWindow 'e benzer. Bir havuz kapsayıcısındaysa havuz kapsayıcısının kendisi pencereden ayrıldığında veya öğe silindiğinde (ör. havuz dolduğunda) ortadan kalkar.Etkileşim senaryosu: * ComposeView bu öğenin Görünüm hiyerarşisindeki tek öğe olması veya karma bir Görüntüleme/Oluşturma ekranı bağlamında (Parça içinde değil) olması durumunda geçerlidir.* RecyclerView gibi bir havuzlama kapsayıcısında öğe olarak ComposeView . |
DisposeOnLifecycleDestroyed |
Sağlanan Lifecycle yok edildiğinde kompozisyon atılır.Birlikte çalışabilirlik senaryosu * ComposeView bir Fragment'in görünümünde. |
DisposeOnViewTreeLifecycleDestroyed |
LifecycleOwner öğesine ait Lifecycle , Görünümün ekli olduğu bir sonraki pencereden ViewTreeLifecycleOwner.get tarafından geri döndürüldüğünde Beste atılır.Birlikte senaryo: * Bir Parçanın Görünümünde ComposeView .* Yaşam döngüsü henüz bilinmeyen bir görünümde ComposeView . |
ComposeView
in Fragments
Oluşturma kullanıcı arayüzü içeriğini bir parçaya veya mevcut bir görüntüleme düzenine dahil etmek istiyorsanız ComposeView
öğesini kullanın ve setContent()
yöntemini çağırın. ComposeView
, Android View
cihazıdır.
ComposeView
öğesini, diğer View
öğeleri gibi XML düzeninize ekleyebilirsiniz:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
Kotlin kaynak kodunda, XML'de tanımlanan düzen kaynağından düzeni artırın. Ardından, XML kimliğini kullanarak ComposeView
'ü alın, ana makine View
için en iyi şekilde çalışan bir derleme stratejisi ayarlayın ve derlemeyi kullanmak için setContent()
'yi çağırın.
class ExampleFragmentXml : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { val view = inflater.inflate(R.layout.fragment_example, container, false) val composeView = view.findViewById<ComposeView>(R.id.compose_view) composeView.apply { // Dispose of the Composition when the view's LifecycleOwner // is destroyed setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { // In Compose world MaterialTheme { Text("Hello Compose!") } } } return view } }
Alternatif olarak, XML düzen dosyanız için oluşturulan bağlama sınıfına referans vererek ComposeView
referansları almak için görünüm bağlamayı da kullanabilirsiniz:
class ExampleFragment : Fragment() { private var _binding: FragmentExampleBinding? = null // This property is only valid between onCreateView and onDestroyView. private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentExampleBinding.inflate(inflater, container, false) val view = binding.root binding.composeView.apply { // Dispose of the Composition when the view's LifecycleOwner // is destroyed setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { // In Compose world MaterialTheme { Text("Hello Compose!") } } } return view } override fun onDestroyView() { super.onDestroyView() _binding = null } }
Şekil 1. Görünüm kullanıcı arayüzü hiyerarşisine Compose öğeleri ekleyen kodun çıkışını gösterir. "Merhaba Android!" metni bir TextView
widget'ı tarafından görüntülenir. "Merhaba Oluştur!" metni, Oluştur metin öğesi tarafından gösterilir.
Tam ekranınız Compose ile oluşturulduysa doğrudan bir fragment'e ComposeView
de ekleyebilirsiniz. Bu sayede XML düzen dosyasını tamamen kullanmadan da yapabilirsiniz.
class ExampleFragmentNoXml : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return ComposeView(requireContext()).apply { // Dispose of the Composition when the view's LifecycleOwner // is destroyed setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { MaterialTheme { // In Compose world Text("Hello Compose!") } } } } }
Aynı düzende birden fazla ComposeView
örneği
Aynı düzende birden fazla ComposeView
öğesi varsa savedInstanceState
'un çalışması için her birinin benzersiz bir kimliği olmalıdır.
class ExampleFragmentMultipleComposeView : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View = LinearLayout(requireContext()).apply { addView( ComposeView(requireContext()).apply { setViewCompositionStrategy( ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed ) id = R.id.compose_view_x // ... } ) addView(TextView(requireContext())) addView( ComposeView(requireContext()).apply { setViewCompositionStrategy( ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed ) id = R.id.compose_view_y // ... } ) } }
ComposeView
kimlikleri res/values/ids.xml
dosyasında tanımlanır:
<resources> <item name="compose_view_x" type="id" /> <item name="compose_view_y" type="id" /> </resources>
Düzenleyici'de bileşenleri önizleme
ComposeView
içeren XML düzeniniz için Layout Editor'da da bileşenleri önizleyebilirsiniz. Bu sayede, kompozisyonlarınızın karma Görünümler ve Oluşturma düzeninde nasıl göründüğünü görebilirsiniz.
Aşağıdaki bileşiği, düzen düzenleyicide görüntülemek istediğinizi varsayalım. @Preview
ile ek açıklama eklenmiş bileşimlerin, düzen düzenleyicide önizlemeye uygun olduğunu unutmayın.
@Preview @Composable fun GreetingPreview() { Greeting(name = "Android") }
Bu composable'ı görüntülemek için tools:composableName
araçları özelliğini kullanın ve değerini, düzende önizlenecek composable'ın tam adına ayarlayın.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.compose.ui.platform.ComposeView android:id="@+id/my_compose_view" tools:composableName="com.example.compose.snippets.interop.InteroperabilityAPIsSnippetsKt.GreetingPreview" android:layout_height="match_parent" android:layout_width="match_parent"/> </LinearLayout>
Sonraki adımlar
Görünümler'de Oluştur'u kullanmak için birlikte çalışabilirlik API'lerini öğrendiniz. Şimdi Oluştur'da Görünümler'i nasıl kullanacağınızı öğrenin.
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Dikkat edilmesi gereken diğer noktalar
- Taşıma stratejisi {:#migration-strategy}
- Oluşturma ve görüntüleme performansını karşılaştırma