Oluşturma kullanıcı arayüzüne Android görünüm hiyerarşisi ekleyebilirsiniz. Bu yaklaşım, özellikle henüz Compose'da bulunmayan kullanıcı arayüzü öğelerini (ör. AdView) kullanmak istediğinizde faydalıdır.
Bu yaklaşım, tasarlamış olabileceğiniz özel görünümleri yeniden kullanmanıza da olanak tanır.
Bir görünüm öğesi veya hiyerarşi eklemek için AndroidView
composable'ını kullanın. AndroidView işlevine View döndüren bir lambda iletilir. AndroidView, görünüm şişirildiğinde çağrılan bir update geri çağırma işlevi de sağlar. AndroidView, geri çağırma içinde okunan bir State değiştiğinde yeniden oluşturulur. AndroidView, diğer birçok yerleşik composable gibi, üst composable'daki konumunu ayarlamak için kullanılabilecek bir Modifier parametresi alır.
@Composable fun CustomView() { var selectedItem by remember { mutableIntStateOf(0) } // Adds view to Compose AndroidView( modifier = Modifier.fillMaxSize(), // Occupy the max size in the Compose UI tree factory = { context -> // Creates view MyView(context).apply { // Sets up listeners for View -> Compose communication setOnClickListener { selectedItem = 1 } } }, update = { view -> // View's been inflated or state read in this block has been updated // Add logic here if necessary // As selectedItem is read here, AndroidView will recompose // whenever the state changes // Example of Compose -> View communication view.selectedItem = selectedItem } ) } @Composable fun ContentExample() { Column(Modifier.fillMaxSize()) { Text("Look at this CustomView!") CustomView() } }
Görünüm bağlama ile AndroidView
XML düzeni yerleştirmek için androidx.compose.ui:ui-viewbinding kitaplığı tarafından sağlanan AndroidViewBinding API'sini kullanın. Bunun için projenizde görünüm bağlama etkinleştirilmelidir.
@Composable fun AndroidViewBindingExample() { AndroidViewBinding(ExampleLayoutBinding::inflate) { exampleView.setBackgroundColor(Color.GRAY) } }
Lazy listelerinde AndroidView
Lazy list'te (LazyColumn, LazyRow, Pager vb.) AndroidView kullanıyorsanız 1.4.0-rc01 sürümünde kullanıma sunulan AndroidView aşırı yüklemesini kullanabilirsiniz. Bu aşırı yükleme, içeren oluşturma yeniden kullanıldığında (ör. geç listeler) Compose'un temel View örneğini yeniden kullanmasına olanak tanır.
AndroidView için bu aşırı yükleme, 2 ek parametre ekler:
onReset:Viewöğesinin yeniden kullanılmak üzere olduğunu bildirmek için çağrılan bir geri çağırma. Görünümün yeniden kullanılabilmesi için bu değer boş olmamalıdır.onRelease(isteğe bağlı):Viewöğesinin oluşturmadan çıktığını ve tekrar kullanılmayacağını bildirmek için çağrılan bir geri çağırma işlevi.
@Composable fun AndroidViewInLazyList() { LazyColumn { items(100) { index -> AndroidView( modifier = Modifier.fillMaxSize(), // Occupy the max size in the Compose UI tree factory = { context -> MyView(context) }, update = { view -> view.selectedItem = index }, onReset = { view -> view.clear() } ) } } }
Oluşturma'da Parçalar (Geçiş Adımı)
Compose'da Fragment eklemek için AndroidFragment composable'ını kullanın.
AndroidFragment, composable oluşturmadan ayrıldığında parçayı kaldırma gibi parçaya özgü işlemlere sahiptir.
Bir parça eklemek için AndroidFragment composable'ını kullanın. AndroidFragment işlevine bir Fragment sınıfı iletirsiniz. Bu işlev, ilgili sınıfın bir örneğini doğrudan oluşturmaya ekler. AndroidFragment, belirli bir durumla AndroidFragment oluşturmak için bir fragmentState nesnesi, yeni fragmana aktarılacak arguments ve oluşturmadan fragmanı sağlayan bir onUpdate geri çağırma işlevi de sağlar. Diğer birçok yerleşik composable gibi AndroidFragment da üst composable'daki konumunu ayarlamak için kullanabileceğiniz bir Modifier parametresi kabul eder.
AndroidFragment yöntemini Compose'da aşağıdaki gibi çağırın:
@Composable fun FragmentInComposeExample() { AndroidFragment<MyFragment>() }
Cap Fragment yaşam döngüsü durumu
Fragment 1.9.0 ve sonraki sürümlerde, yerleştirilmiş Fragment öğesinin yaşam döngüsü durumunu sınırlamak için maxLifecycle parametresini kullanabilirsiniz.
Örneğin, bir HorizontalPager içinde, maxLifecycle değerini yalnızca ilgili sayfa etkin olduğunda dinamik olarak RESUMED şeklinde ayarlayabilir ve ekran dışı sayfaları STARTED ile sınırlayabilirsiniz. Kullanıcı başka bir sayfaya gittiğinde önceki sayfanın parça sınırı STARTED olur. Bu işlem, RESUMED kapsamındaki iş yüklerini (ör. repeatOnLifecycle(RESUMED) içinde çalışan eş yordamlar) duraklatır veya iptal eder. Böylece, ekran dışı sayfaların yalnızca ön planda yapılan işlemleri gerçekleştirmesi engellenir ve kullanıcı arayüzleri STARTED durumunda başlatılmış olarak kalır:
HorizontalPager(state = pagerState) { page -> // Dynamically cap the lifecycle state based on whether the page is selected val maxLifecycle = if (pagerState.settledPage == page) { Lifecycle.State.RESUMED } else { Lifecycle.State.STARTED } when (page) { 0 -> AndroidFragment<HomeFragment>(maxLifecycle = maxLifecycle) 1 -> AndroidFragment<LibraryFragment>(maxLifecycle = maxLifecycle) /* Other pages and corresponding fragments */ } }
Compose'dan Android çerçevesini çağırma
Compose, Android çerçeve sınıfları içinde çalışır. Örneğin, Activity veya Fragment gibi Android View sınıflarında barındırılır ve Context, sistem kaynakları, Service veya BroadcastReceiver gibi Android çerçeve sınıflarını kullanabilir.
Sistem kaynakları hakkında daha fazla bilgi edinmek için Compose'da kaynaklar başlıklı makaleyi inceleyin.
CompositionLocal'lar
CompositionLocal
sınıfları, verilerin composable işlevler aracılığıyla dolaylı olarak iletilmesine olanak tanır. Genellikle kullanıcı arayüzü ağacının belirli bir düğümünde bir değerle sağlanırlar. Bu değer, CompositionLocal öğesini composable işlevde parametre olarak tanımlamadan composable alt öğeleri tarafından kullanılabilir.
CompositionLocal, Compose'da Android çerçeve türlerinin değerlerini yaymak için kullanılır. Örneğin, Compose kodunun barındırıldığı Context, Configuration veya View, ilgili LocalContext, LocalConfiguration ya da LocalView ile birlikte kullanılır.
IDE'de otomatik tamamlama ile daha kolay bulunabilmeleri için CompositionLocal sınıflarının önüne Local eklendiğini unutmayın.
current özelliğini kullanarak bir CompositionLocal öğesinin mevcut değerine erişin. Örneğin, aşağıdaki kodda Toast.makeToast yöntemine LocalContext.current sağlanarak bir pop-up mesaj gösterilmektedir.
@Composable fun ToastGreetingButton(greeting: String) { val context = LocalContext.current Button(onClick = { Toast.makeText(context, greeting, Toast.LENGTH_SHORT).show() }) { Text("Greet") } }
Yayın alıcıları
CompositionLocal ve yan etkileri göstermek için bir BroadcastReceiver'nin composable işlevden kaydedilmesi gerekiyorsa geçerli bağlamı kullanmak için LocalContext, rememberUpdatedState ve DisposableEffect yan etkilerini kullanın.
@Composable fun SystemBroadcastReceiver( systemAction: String, onSystemEvent: (intent: Intent?) -> Unit ) { // Grab the current context in this part of the UI tree val context = LocalContext.current // Safely use the latest onSystemEvent lambda passed to the function val currentOnSystemEvent by rememberUpdatedState(onSystemEvent) // If either context or systemAction changes, unregister and register again DisposableEffect(context, systemAction) { val intentFilter = IntentFilter(systemAction) val broadcast = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { currentOnSystemEvent(intent) } } context.registerReceiver(broadcast, intentFilter) // When the effect leaves the Composition, remove the callback onDispose { context.unregisterReceiver(broadcast) } } } @Composable fun HomeScreen() { SystemBroadcastReceiver(Intent.ACTION_BATTERY_CHANGED) { batteryStatus -> val isCharging = /* Get from batteryStatus ... */ true /* Do something if the device is charging */ } /* Rest of the HomeScreen */ }
Diğer etkileşimler
İhtiyacınız olan etkileşim için tanımlanmış bir yardımcı program yoksa en iyi uygulama, genel Compose yönergesini (veriler aşağı, etkinlikler yukarı akar) takip etmektir. Bu konu, Compose'da Düşünme bölümünde daha ayrıntılı olarak ele alınmıştır. Örneğin, bu composable farklı bir etkinlik başlatır:
class OtherInteractionsActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // get data from savedInstanceState setContent { MaterialTheme { ExampleComposable(data, onButtonClick = { startActivity(Intent(this, MyActivity::class.java)) }) } } } } @Composable fun ExampleComposable(data: DataExample, onButtonClick: () -> Unit) { Button(onClick = onButtonClick) { Text(data.title) } }