फ़ोकस करने के लिए प्रतिक्रिया दें

कंपोज़िशन ट्री में फ़ोकस बदलने पर, Compose एक फ़ोकस इवेंट ट्रिगर करता है. इसे पैरंट और चाइल्ड मॉडिफ़ायर देख सकते हैं. onFocusChanged मॉडिफ़ायर का इस्तेमाल करके, फ़ोकस की स्थिति में होने वाले बदलावों को सुना जा सकता है. साथ ही, मौजूदा फ़ोकस प्रॉपर्टी के बारे में क्वेरी की जा सकती है और स्थिति के हिसाब से यूज़र इंटरफ़ेस (यूआई) में होने वाले अपडेट ट्रिगर किए जा सकते हैं.

onFocusChanged की मदद से, फ़ोकस की स्थिति पर नज़र रखना

onFocusChanged मॉडिफ़ायर, FocusState ऑब्जेक्ट उपलब्ध कराता है. ऐसा तब होता है, जब किसी एलिमेंट पर फ़ोकस किया जाता है या उससे फ़ोकस हटाया जाता है.

उदाहरण के लिए, कस्टम कॉम्पोनेंट की स्थिति को अपडेट करने के लिए, फ़ोकस में हुए बदलावों को देखा जा सकता है. जैसे, किसी एलिमेंट के बॉर्डर का रंग बदलना या कोई ऐनिमेशन ट्रिगर करना:

var color by remember { mutableStateOf(Color.White) }
Card(
    modifier = Modifier
        .onFocusChanged {
            color = if (it.isFocused) Red else White
        }
        .border(5.dp, color)
) {}

इस उदाहरण में, remember रीकंपोज़िशन के दौरान बॉर्डर के रंग को सेव रखता है. साथ ही, एलिमेंट के फ़ोकस की स्थिति बदलने पर, बॉर्डर का रंग अपडेट हो जाता है.

FocusState प्रॉपर्टी

onFocusChanged को पास किया गया FocusState ऑब्जेक्ट, तीन मुख्य प्रॉपर्टी उपलब्ध कराता है:

  • isFocused: अगर इस मॉडिफ़ायर से जुड़ा कंपोज़ेबल फ़िलहाल ऐक्टिव इनपुट फ़ोकस में है, तो यह true दिखाता है.
  • hasFocus: अगर इस कंपोज़ेबल या इसके किसी चाइल्ड कंपोज़ेबल पर फ़िलहाल फ़ोकस है, तो यह true दिखाता है. यह पैरंट कंटेनर (जैसे, कार्ड या टूलबार) के लिए मददगार होता है. इन्हें यह जानने की ज़रूरत होती है कि उनके अंदर मौजूद कोई चाइल्ड एलिमेंट कब चालू है.
  • isCaptured: अगर फ़ोकस फ़िलहाल एलिमेंट पर लॉक है, तो true दिखाता है. उदाहरण के लिए, captureFocus() का इस्तेमाल करके मॉडल सब-इंटरैक्शन के दौरान. कैप्चर किए जाने के दौरान, फ़ोकस को अन्य एलिमेंट पर ले जाने की कोशिश करने से फ़ोकस नहीं हटता.
Modifier.onFocusChanged { focusState ->
    val isFocused = focusState.isFocused
    val hasFocus = focusState.hasFocus
    val isCaptured = focusState.isCaptured
}