2015-04-09 3 views
14

मान लें कि मेरे पास एक कस्टम व्यू ग्रुप है जो फोकस करने योग्य है और इसमें कुछ बच्चे के विचार भी हैं जो फोकस करने योग्य हैं (Android सेट-टॉप-बॉक्स के लिए कस्टम वर्टिकल मेनू जो रिमोट कंट्रोलर पर प्रतिक्रिया देना चाहिए)।कस्टम व्यू ग्रुप फोकस हैंडलिंग

जब भी कस्टम व्यू ग्रुप फोकस प्राप्त करता है तो मुझे कुछ बच्चे के विचारों पर ध्यान केंद्रित करने की आवश्यकता होती है।

मैंने descendantFocusabilitybeforeDescendants पर सेट किया है और OnFocusChangeListener कस्टम व्यू ग्रुप पर सेट किया है लेकिन OnFocusChangeListener.onFocusChanged() कभी नहीं कहा जाता है। ऐसा लगता है कि beforeDescendants मेरी अपेक्षा के अनुसार काम नहीं करता है। असल में beforeDescendants को afterDescendants सेट करने जैसा ही काम करता है - फोकस निकटतम बच्चे के दृश्य द्वारा लिया जाता है और कस्टम व्यू ग्रुप को यह तय करने का अवसर नहीं है कि कौन से बच्चे के दृश्य को ध्यान में रखना चाहिए।

मैं वांछित व्यवहार कैसे प्राप्त कर सकता हूं? ViewGroup एस में फ़ोकस को संभालने के लिए सर्वोत्तम प्रथाएं क्या हैं?

+1

क्या आपको अपनी समस्या का समाधान मिला? मैं एक समान समस्या का हल ढूंढ रहा हूं। मैं जानना चाहता हूं कि व्यू ग्रुप "फोकस" कब होता है, यानी कोई बच्चा दृश्य फोकस नहीं करता है। – AlanKley

+0

@AlanKley देर से प्रतिक्रिया के लिए खेद है ... दुर्भाग्य से मुझे इसके लिए कोई समाधान नहीं मिला। मैंने OnFocusChangeListener को सभी ViewGroup के बच्चों को सेट करके "हल किया" और श्रोता के अंदर तर्क (किस बच्चे को ध्यान केंद्रित करना चाहिए) ... यदि आपको कोई समाधान मिलता है, तो इसे यहां लिखने के लिए स्वतंत्र महसूस करें :) – traninho

उत्तर

0

एंड्रॉइड स्रोतों में खुदाई के बाद मैं समझता हूं कि ViewGroup के बच्चों को फोकस कैसे प्रेषित किया जाए। उदाहरण के लिए मेरे पास कुछ EditText फ़ील्ड के साथ कस्टम ViewGroup है। जब उपयोगकर्ता ViewGroup पर क्लिक करता है (प्रत्येक EditText के बाहर) मैं फ़ील्ड में से किसी एक पर फ़ोकस भेजना चाहता हूं।

ऐसा करने के लिए हमें FOCUS_AFTER_DESCENDANTS पर अवरोधक फोकसबिलिटी सेट करने की आवश्यकता है। इसका मतलब है कि हम से पहले फोकस घटना संभाल कर सकते हैं हमारे कस्टम दृश्य ही ध्यान केंद्रित करने की कोशिश करेंगे:

setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); 


अगला चरण onRequestFocusInDescendants विधि ओवरराइड करने के लिए है, यह सक्रिय किया जाएगा से पहले कस्टम दृश्य के requestFocus अगर झंडा FOCUS_AFTER_DESCENDANTS सेट था। इस विधि के साथ

@Override 
protected boolean onRequestFocusInDescendants(final int dir, final Rect rect) { 
    return getChildAt(this.target).requestFocus(); 
} 

एक महत्वपूर्ण बात: इस विधि में हम बच्चे को फोकस अनुरोध कर सकते हैं अगर हम true वापस यहां आएं, हमारे कस्टम दृश्य (केवल FOCUS_AFTER_DESCENDANTS के साथ) ध्यान केंद्रित करने का अनुरोध किया नहीं किया जाएगा।

इस तरह से हम फ़ील्ड को बदल सकते हैं ताकि ViewGroup पर क्लिक किया जा सके कि कौन सा बच्चा केंद्रित होगा।


बेहतर समझने के लिए आप requestFocus विधि ViewGroup में एंड्रॉइड स्रोतों में पा सकते हैं।

संबंधित मुद्दे