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

कंपोज़िशन ट्री में फ़ोकस बदलने पर, 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
}