सवाल किसी अन्य नियंत्रण पर ध्यान केंद्रित किए बिना फोकस कैसे हटाएं?


मुझे अपने यूआई को अंतर्ज्ञानी होना पसंद है; प्रत्येक स्क्रीन को स्वाभाविक रूप से और अविश्वसनीय रूप से उपयोगकर्ता को ऐप में अगले चरण पर मार्गदर्शन करना चाहिए। इसे छोड़कर, मैं चीजों को भ्रमित और भ्रमित करने के रूप में संभव बनाने के लिए प्रयास करता हूं।

मजाक कर रहा हूं :-)

मुझे तीन मिल गया है TableRowएस, प्रत्येक में केवल पढ़ने-योग्य और गैर-केंद्रित संपादन संपादन नियंत्रण होता है और फिर उसके दाईं ओर एक बटन होता है। प्रत्येक बटन एक ही गतिविधि शुरू करता है लेकिन एक अलग तर्क के साथ। उपयोगकर्ता वहां एक चयन करता है और उप-गतिविधि समाप्त होती है, उचित रूप से पॉप्युलेट कर रही है EditText उपयोगकर्ता के चयन के साथ।

यह क्लासिक कैस्केडिंग वैल्यू तंत्र है; प्रत्येक चयन अगले चयन, आदि के लिए उपलब्ध विकल्पों को संक्षिप्त करता है। इस प्रकार मैं अगली पंक्तियों में से प्रत्येक पर दोनों नियंत्रणों को अक्षम कर रहा हूं जब तक कि वर्तमान पंक्ति में एडिटटेक्स्ट में कोई मान न हो।

वरीयता के इस क्रम में, मुझे दो चीजों में से एक करने की ज़रूरत है:

  1. जब कोई बटन क्लिक किया जाता है, तो तुरंत किसी भिन्न बटन पर फ़ोकस सेट किए बिना फोकस हटा दें
  2. गतिविधि शुरू होने पर पहले बटन पर फ़ोकस सेट करें

उप-गतिविधि रिटर्न के बाद समस्या प्रकट होती है; क्लिक किया गया बटन फोकस बरकरार रखता है।

पुन: ऊपर # 1 - एक ऐसा प्रतीत नहीं होता है removeFocus() विधि, या कुछ समान है

पुन: # 2 ऊपर - मैं उपयोग कर सकते हैं requestFocus() अगली पंक्ति पर बटन पर फ़ोकस सेट करने के लिए, और यह उप-गतिविधि रिटर्न के बाद काम करता है, लेकिन किसी कारण से यह मूल गतिविधि में काम नहीं करता है onCreate()

मुझे किसी भी दिशा में यूआई स्थिरता की आवश्यकता है - या तो उप-गतिविधि खत्म होने के बाद कोई बटन फोकस नहीं करता है या प्रत्येक बटन को तर्क प्रवाह में अपनी जगह के आधार पर फोकस प्राप्त होता है, जिसमें किसी भी चयन से पहले पहले (और केवल) सक्रिय बटन शामिल होते हैं।


68
2018-05-24 23:17


मूल




जवाब:


ClearFocus () का उपयोग करना मेरे लिए काम नहीं कर रहा था जैसा कि आपने पाया (किसी अन्य उत्तर में टिप्पणियों में देखा), लेकिन अंत में मेरे लिए क्या काम किया गया था:

<LinearLayout 
    android:id="@+id/my_layout" 
    android:focusable="true" 
    android:focusableInTouchMode="true" ...>

मेरे बहुत ही शीर्ष स्तर लेआउट व्यू (एक रैखिक लेआउट) के लिए। सभी बटन / एडिटटेक्स आदि से फोकस हटाने के लिए, आप बस कर सकते हैं

LinearLayout myLayout = (LinearLayout) activity.findViewById(R.id.my_layout);
myLayout.requestFocus();

फोकस का अनुरोध करने तक कुछ भी नहीं हुआ जब तक कि मैं दृश्य को ध्यान केंद्रित करने के लिए सेट नहीं करता।


139
2018-05-24 23:29



एक क्षणिक क्षण के लिए मैंने सोचा कि यह काम कर सकता है। "इसकी सादगी में कितना सुंदर है!" मैंने अपने आप से कहा। हाय, ऐसा नहीं होना था। यहां तक ​​कि जब मैं requestFocus को हटा देता हूं () अगली पंक्ति के बटन को फोकस मिलता है। यह दूसरी वरीयता के रूप में ठीक होगा, लेकिन केवल अगर मैं किसी भी तरह से क्रिएट () में पहले बटन पर फ़ोकस सेट कर सकता हूं। - InteXX
@InteXX: मैं आज इस समस्या में फिर से आया और एक समाधान मिला। मुझे पता है कि अब आप एक अलग मार्ग से नीचे चले गए हैं, लेकिन अगर आप कभी भी एक ही नाव में खुद को पाते हैं तो इसे आज़माएं! - actionshrimp
"मुझे पता है कि अब आप एक अलग मार्ग नीचे गए हैं" अभी भी बैक अप लेने में बहुत देर हो चुकी है :-) मैं इसे आज़मा दूंगा और धन्यवाद, धन्यवाद। - InteXX
अरे। लगभग, लेकिन काफी नहीं। हां, यह अंतिम क्लिक किए गए बटन पर ध्यान केंद्रित करता है, लेकिन यह तब भी किसी भी बटन को फोकस प्राप्त करने से रोकता है। इसका मतलब यह होगा कि मेरे गैर-स्पर्श उपयोगकर्ता एक बटन पर क्लिक नहीं कर पाएंगे। क्या यह आपके लिए भी वही कर रहा है? - InteXX
यह स्क्रॉलव्यू पर काम नहीं करेगा। यदि आपका शीर्ष दृश्य स्क्रॉलव्यू है, तो इसे अपने बच्चे पर उपयोग करें। - Uroš Podkrižnik


पुराना सवाल, लेकिन जब मैं एक समान मुद्दा था और सोचा कि मैं जो कुछ भी कर रहा हूं, वह साझा करता हूं।

फोकस प्राप्त करने वाला विचार प्रत्येक बार अलग था इसलिए मैंने बहुत सामान्य उपयोग किया:

View current = getCurrentFocus();
if (current != null) current.clearFocus();

66
2018-03-18 16:10



ऐसा करने का सुरुचिपूर्ण तरीका। स्पष्ट फोकस () को कॉल करने से पहले कोई getCurrentFocus () से शून्य मान को देखना चाहता है - Vering
+1 हां, आपको उस शून्य जांच में फेंकना होगा! जावा क्यों एक सुरक्षित-ट्रैवर्सल-ऑपरेटर को लागू नहीं कर सकता है? यह उतना आसान होगा जितना getCurrentFocus()?.clearFocus();, बहुत अच्छा और सुरुचिपूर्ण: - / - Levit
@ विल्ल्मा: हाँ, यह वही था जो मेरा मतलब था। - Vering
@ लेविट बहुत स्विफ्ट की तरह। :-) लेकिन अगर जावा ने ऐसे ऑपरेटर को लागू किया है, तो भी इसे पकड़ने के लिए एंड्रॉइड 4 साल लगेंगे। - Greg Brown
@ लेविट, आपने शायद इसे अब तक पाया है, लेकिन कोटलिन। - prodaea


  1. आप उपयोग कर सकते हैं View.clearFocus()

  2. उपयोग View.requestFocus() से बुलाया onResume()


8
2018-05-24 23:33



@ सिलिकोनगल: अब यह बहुत अजीब है। (पॉइंटर को साफ़ करने के लिए धन्यवाद फोकस () बीटीडब्ल्यू - मुझे इसके बारे में पता नहीं था।) जब मैं पहले बटन पर क्लिक करता हूं, तो चयन करता हूं, और फिर वापस लौटाता है, पहला बटन अब फोकस प्राप्त नहीं कर सकता है। मैं अपने कोड में कहीं भी इस बटन के लिए फोकस करने योग्य नहीं लगा रहा हूं। मैं आपको अपना कोड दिखाना चाहता हूं, लेकिन इस संपादन विंडो में पर्याप्त वर्ण उपलब्ध नहीं हैं और एसओ के लिए नया होने के नाते मुझे यकीन नहीं है कि मुझे कोड पोस्ट करने में सक्षम होने के लिए एक और जवाब दर्ज करना चाहिए या नहीं। - InteXX
@ सिलिकॉनगल: दुर्भाग्यवश, clearFocus () काम नहीं करता है - उप-गतिविधि लौटने पर बटन फोकस बनाए रखते हैं। - InteXX
@ सिलिकोनगल: ठीक है, उस पहली टिप्पणी के बारे में कभी भी ध्यान न दें। मैं बटन के क्लिक ईवेंट में setFocusable (false) का उपयोग कर रहा था और उप-गतिविधि लौटने के बाद इसे वापस चालू करना भूल गया था। clearFocus () अभी भी कोई प्रभाव नहीं है - मुझे आश्चर्य है क्यों? मैं इसे एक्टिविटी रिसैट () से सभी बटनों पर कॉल कर रहा हूं, लेकिन क्लिक किया गया बटन अभी भी फोकस बरकरार रखता है। अजीब। - InteXX
@ सिलिकॉनगल: @actionshrimp: मैंने सभी फोकस-संबंधित आदेशों और सेटिंग्स को दूर करने का निर्णय लिया है। मेरा मूल उद्देश्य अक्षम बटनों पर ध्यान केंद्रित करना था, लेकिन यदि यह लागत है तो यह इसके लायक नहीं है। बिना किसी अनुरोध के फोकस (), clearFocus () या setFocusable (), उप-गतिविधि रिटर्न के बाद कोई बटन फ़ोकस बरकरार नहीं रखता है। यह दो कमजोरियों में से कम है - मुझे लगता है कि मुझे उपयोगकर्ता के साथ एक अक्षम बटन पर फ़ोकस सेट करने में सक्षम होना होगा। - InteXX
अक्षम तत्व फोकस करने योग्य नहीं हैं AFAIK ... setEnabled (false) का उपयोग करें - siliconeagle


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:id="@+id/ll_root_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

LinearLayout llRootView = findViewBindId(R.id.ll_root_view);
llRootView.clearFocus();

जब मैं पहले ही प्रोफाइल प्रोफाइल जानकारी समाप्त कर चुका हूं और अपने लेआउट में एडिटटेक्स्ट से सभी फोकस हटा देता हूं तो इसका उपयोग करता हूं

====> अद्यतन: पैरेंट लेआउट सामग्री में मेरी संपादन टेक्स्ट पंक्ति जोड़ें:

android:focusableInTouchMode="true"

5
2017-12-02 05:04





बस जोड़ने के बारे में क्या android:windowSoftInputMode="stateHidden" मैनिफेस्ट में आपकी गतिविधि पर।

इस पर टिप्पणी करने वाले एक स्मार्ट आदमी से लिया गया: https://stackoverflow.com/a/2059394/956975


3
2017-11-12 18:35





सबसे पहले, यह 100% काम करेगा ........

  1. सर्जन करना onResume() तरीका।
  2. इसके अंदर onResume() उस दृश्य को ढूंढें जो बार-बार ध्यान केंद्रित कर रहा है findViewById()
  3. इसके अंदर onResume() सेट requestFocus() इस विचार के लिए।
  4. इसके अंदर onResume() सेट clearFocus इस विचार के लिए।
  5. उसी लेआउट के एक्सएमएल में जाएं और उस शीर्ष दृश्य को ढूंढें जिसे आप केंद्रित करना चाहते हैं और सेट करना चाहते हैं focusableसच और focusableInTuch सच।
  6. इसके अंदर onResume() उपर्युक्त शीर्ष दृश्य को ढूंढें findViewById 
  7. इसके अंदर onResume() सेट requestFocus() आखिरी बार इस दृश्य के लिए।
  8. और अब आनंद लें ......

2
2017-12-02 09:20





मैंने देखने के लिए फोकस करने योग्यता को अक्षम करने और सक्षम करने की कोशिश की और यह मेरे लिए काम किया (फोकस रीसेट किया गया था):

focusedView.setFocusable(false);
focusedView.setFocusableInTouchMode(false);
focusedView.setFocusable(true);
focusedView.setFocusableInTouchMode(true);

2
2018-06-26 12:23





आप मुख्य गतिविधि की अपनी स्थिति को बचाने की क्षमता को बंद करने का प्रयास कर सकते हैं (इस प्रकार यह भूल जाते हैं कि किस नियंत्रण में पाठ था और किस पर ध्यान केंद्रित किया गया था)। आपको अपने एडिटटेक्स्ट के पास याद रखने और उन्हें दोहराने के लिए याद रखने का कोई और तरीका होगा।) ()। StartActivityForResult () के साथ अपनी उप-गतिविधियां लॉन्च करें और अपनी मुख्य गतिविधि में एक एक्टिविटी रिसैट () हैंडलर बनाएं जो संपादन टेक्स्ट को सही तरीके से अपडेट करेगी। इस तरह आप एक उचित बटन सेट कर सकते हैं जिसे आप रेस्यूम () पर केंद्रित करना चाहते हैं, उसी समय जब आप myButton.post (नया रननेबल () {run () {myButton.requestFocus ();}} का उपयोग करके संपादन टेक्स्ट को दोबारा दोहराएं);

View.post () विधि प्रारंभ में फोकस सेट करने के लिए उपयोगी है क्योंकि खिड़की बनने के बाद उस रननेबल को निष्पादित किया जाएगा और चीजें व्यवस्थित हो जाएंगी, जिससे फोकस तंत्र उस समय ठीक से काम कर सके। क्रेट / स्टार्ट / रेज़्यूमे () के दौरान फ़ोकस सेट करने का प्रयास करने में आमतौर पर समस्याएं होती हैं, मुझे पता चला है।

कृपया ध्यान दें कि यह छद्म कोड है और गैर-परीक्षण किया गया है, लेकिन यह एक संभावित दिशा है जिसे आप आजमा सकते हैं।


1
2017-09-13 01:17



दूसरे विचार पर ... गतिविधि की सहेजी गई स्थिति को बंद करने के बजाय पहले View.post () सामग्री का उपयोग करने का प्रयास करें। यह आपके लिए सब कुछ चाल हो सकता है। - Uncle Code Monkey
हां, मेरे पास अब हमारे लिए इसका परीक्षण करने का एक आसान तरीका नहीं है। मैंने तब से देशी कोड मॉडल को त्यागने और मोबाइल ऐप्स के लिए HTML5 / CSS3 के साथ जाने का निर्णय लिया है, और इस प्रकार तदनुसार मेरे सिस्टम को फिर से बदल दिया है। लेकिन बहुत गहराई से जवाब देने के लिए धन्यवाद। मैंने इसे वोट दिया। - InteXX