Compose यूज़र इंटरफ़ेस (यूआई) में, Android व्यू हैरारकी को शामिल किया जा सकता है. यह तरीका खास तौर पर तब मददगार होता है, जब आपको ऐसे यूज़र इंटरफ़ेस (यूआई) एलिमेंट इस्तेमाल करने हों जो Compose में अब तक उपलब्ध नहीं हैं. जैसे, AdView
.
इस तरीके से, आपके पास डिज़ाइन किए गए कस्टम व्यू को फिर से इस्तेमाल करने का विकल्प भी होता है.
व्यू एलिमेंट या हैरारकी को शामिल करने के लिए, AndroidView
कंपोज़ेबल का इस्तेमाल करें. AndroidView
को एक ऐसा लैम्डा पास किया जाता है जो View
दिखाता है. AndroidView
एक update
कॉलबैक भी देता है. इसे व्यू के बड़ा होने पर कॉल किया जाता है. कॉल बैक में पढ़ी गई किसी भी वैल्यू में बदलाव होने पर, AndroidView
फिर से कंपोज़ होता है.State
AndroidView
, कई अन्य बिल्ट-इन कंपोज़ेबल की तरह, एक Modifier
पैरामीटर लेता है. इसका इस्तेमाल, उदाहरण के लिए, पैरंट कंपोज़ेबल में इसकी पोज़िशन सेट करने के लिए किया जा सकता है.
@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() } }
AndroidView
व्यू बाइंडिंग के साथ
एक्सएमएल लेआउट को एम्बेड करने के लिए, AndroidViewBinding
एपीआई का इस्तेमाल करें. यह एपीआई, androidx.compose.ui:ui-viewbinding
लाइब्रेरी से मिलता है. इसके लिए, आपके प्रोजेक्ट में व्यू बाइंडिंग की सुविधा चालू होनी चाहिए.
@Composable fun AndroidViewBindingExample() { AndroidViewBinding(ExampleLayoutBinding::inflate) { exampleView.setBackgroundColor(Color.GRAY) } }
लेज़ी लिस्ट में AndroidView
अगर लेज़ी लिस्ट (LazyColumn
, LazyRow
, Pager
वगैरह) में AndroidView
का इस्तेमाल किया जा रहा है, तो वर्शन 1.4.0-rc01 में पेश किए गए AndroidView
ओवरलोड का इस्तेमाल करें. इस ओवरलोड की मदद से, कंपोज़, View
इंस्टेंस का फिर से इस्तेमाल कर सकता है. ऐसा तब होता है, जब कंपोज़िशन को फिर से इस्तेमाल किया जाता है. जैसे, लेज़ी लिस्ट के लिए ऐसा होता है.
AndroidView
के इस ओवरलोड में दो और पैरामीटर जोड़े गए हैं:
onReset
- यह एक कॉलबैक है. इसे तब शुरू किया जाता है, जबView
को फिर से इस्तेमाल किया जाना हो. व्यू को फिर से इस्तेमाल करने की सुविधा चालू करने के लिए, यह वैल्यू शून्य नहीं होनी चाहिए.onRelease
(ज़रूरी नहीं) - यह एक कॉलबैक है. इसका इस्तेमाल यह सूचना देने के लिए किया जाता है किView
ने कंपोज़िशन छोड़ दी है और इसे फिर से इस्तेमाल नहीं किया जाएगा.
@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() } ) } } }
Compose में फ़्रैगमेंट
Compose में Fragment
जोड़ने के लिए, AndroidViewBinding
कंपोज़ेबल का इस्तेमाल करें.
AndroidViewBinding
में फ़्रैगमेंट के हिसाब से हैंडलिंग होती है. जैसे, कंपोज़ेबल के कंपोज़िशन से बाहर निकलने पर फ़्रैगमेंट को हटाना.
इसके लिए, FragmentContainerView
को Fragment
के होल्डर के तौर पर शामिल करके, XML को बड़ा करें.
उदाहरण के लिए, अगर आपने my_fragment_layout.xml
को तय किया है, तो android:name
एक्सएमएल एट्रिब्यूट को Fragment
के क्लास नेम से बदलते समय, इस तरह के कोड का इस्तेमाल किया जा सकता है:
<androidx.fragment.app.FragmentContainerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container_view" android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.example.compose.snippets.interop.MyFragment" />
Compose में इस फ़्रैगमेंट को इस तरह बड़ा करें:
@Composable fun FragmentInComposeExample() { AndroidViewBinding(MyFragmentLayoutBinding::inflate) { val myFragment = fragmentContainerView.getFragment<MyFragment>() // ... } }
अगर आपको एक ही लेआउट में कई फ़्रैगमेंट इस्तेमाल करने हैं, तो पक्का करें कि आपने हर FragmentContainerView
के लिए एक यूनीक आईडी तय किया हो.
Compose से Android फ़्रेमवर्क को कॉल करना
Compose, Android फ़्रेमवर्क क्लास में काम करता है. उदाहरण के लिए, इसे Android View क्लास पर होस्ट किया जाता है. जैसे, Activity
या Fragment
. साथ ही, यह Android फ़्रेमवर्क क्लास का इस्तेमाल कर सकता है. जैसे, Context
, सिस्टम रिसॉर्स, Service
या BroadcastReceiver
.
सिस्टम संसाधनों के बारे में ज़्यादा जानने के लिए, Compose में संसाधन देखें.
कंपोज़िशन के लोकल
CompositionLocal
क्लास की मदद से, कंपोज़ेबल फ़ंक्शन के ज़रिए डेटा को इंप्लिसिट तौर पर पास किया जा सकता है. ये आम तौर पर, यूज़र इंटरफ़ेस (यूआई) ट्री के किसी नोड में वैल्यू के साथ दिए जाते हैं. इस वैल्यू का इस्तेमाल, कंपोज़ेबल फ़ंक्शन के डिसेंडेंट कर सकते हैं. इसके लिए, कंपोज़ेबल फ़ंक्शन में CompositionLocal
को पैरामीटर के तौर पर एलान करने की ज़रूरत नहीं होती.
CompositionLocal
का इस्तेमाल, Compose में Android फ़्रेमवर्क टाइप के लिए वैल्यू को आगे बढ़ाने के लिए किया जाता है. जैसे, Context
, Configuration
या View
, जिसमें Compose कोड को LocalContext
, LocalConfiguration
या LocalView
के साथ होस्ट किया जाता है.
ध्यान दें कि CompositionLocal
क्लास के नाम से पहले Local
लगाया जाता है, ताकि आईडीई में ऑटोकंप्लीट की सुविधा के साथ बेहतर तरीके से खोजा जा सके.
current
की मौजूदा वैल्यू को ऐक्सेस करने के लिए, उसकी current
प्रॉपर्टी का इस्तेमाल करें.CompositionLocal
उदाहरण के लिए, नीचे दिए गए कोड में Toast.makeToast
तरीके में LocalContext.current
डालकर, एक सूचना वाला मैसेज दिखाया गया है.
@Composable fun ToastGreetingButton(greeting: String) { val context = LocalContext.current Button(onClick = { Toast.makeText(context, greeting, Toast.LENGTH_SHORT).show() }) { Text("Greet") } }
ज़्यादा जानकारी के लिए, इस दस्तावेज़ के आखिर में मौजूद केस स्टडी: BroadcastReceivers सेक्शन देखें.
अन्य इंटरैक्शन
अगर आपको जिस इंटरैक्शन के लिए यूटिलिटी की ज़रूरत है वह उपलब्ध नहीं है, तो सबसे सही तरीका यह है कि Compose के सामान्य दिशा-निर्देश का पालन करें. इसके मुताबिक, डेटा नीचे की ओर जाता है और इवेंट ऊपर की ओर जाते हैं. इसके बारे में Compose के बारे में सोचना लेख में ज़्यादा जानकारी दी गई है. उदाहरण के लिए, यह कंपोज़ेबल एक अलग गतिविधि लॉन्च करता है:
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) } }
केस स्टडी: ब्रॉडकास्ट रिसीवर
मान लें कि आपको किसी कंपोज़ेबल फ़ंक्शन से BroadcastReceiver
रजिस्टर करना है. इससे आपको Compose में माइग्रेट या लागू की जा सकने वाली सुविधाओं का ज़्यादा बेहतर उदाहरण मिलेगा. साथ ही, CompositionLocal
और साइड इफ़ेक्ट के बारे में भी पता चलेगा.
इस समाधान में, मौजूदा कॉन्टेक्स्ट का इस्तेमाल करने के लिए LocalContext
का इस्तेमाल किया जाता है. साथ ही, rememberUpdatedState
और DisposableEffect
के साइड इफ़ेक्ट का इस्तेमाल किया जाता है.
@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 */ }
अगले चरण
अब आपको Views में Compose का इस्तेमाल करते समय इंटरऑपरेबिलिटी एपीआई के बारे में पता चल गया है. साथ ही, आपको यह भी पता चल गया है कि Compose में Views का इस्तेमाल करते समय इंटरऑपरेबिलिटी एपीआई के बारे में क्या ध्यान रखना चाहिए. ज़्यादा जानने के लिए, अन्य बातों का ध्यान रखें पेज पर जाएं.
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक टेक्स्ट दिखता है
- अन्य बातें
- लिखने में मदद करने वाली सुविधा के बुरे असर
- CompositionLocal के साथ स्थानीय तौर पर स्कोप किया गया डेटा