दिलचस्प पोस्ट
हमें अचल वर्ग की आवश्यकता क्यों है? अद्वितीय मशीन आईडी प्राप्त करें मैं स्पष्ट रूप से एक फ़ाइल की जाँच कर रहा हूँ जिसे रिकॉर्डेस में चेक किया गया है? कांगारू में "नियंत्रक के रूप में" का क्या लाभ है? पृष्ठभूमि में पुश सूचनाएं प्राप्त करना एक चरित्र निरंतर में एकाधिक वर्ण किसी बिंदु पर ज़ूम इन करें (स्केल और अनुवाद का उपयोग करके) iPhone UITableView – हटाएं बटन सॉकेट '/var/mysql/mysql.sock' के माध्यम से स्थानीय MySQL सर्वर से कनेक्ट नहीं किया जा सकता है (38) मैं Symfony2 config.yml से कॉन्फ़िगरेशन सेटिंग्स कैसे पढ़ूं? एसक्यूएल: परिणाम पंक्ति को कई बार दोहराएं, और पंक्तियों की संख्या Matplotlib में दो भूखंडों के बीच लाइनों को आकर्षित करना पूर्ण विशेषाधिकार के साथ जावा फाइल को व्यवस्थापक के रूप में चलाएं अंडरस्कोर में बाहरी टेम्पलेट एनएसएआरआरई और एनएसएमयूटीएबलएआरआरई पर प्रतिलिपि और अयोग्य परिवर्तन कैसे लागू होते हैं?

ListView में फोकसबल संपादन टेक्स्ट

मैंने अभी तक इस बारे में लगभग 6 घंटे बिताए हैं, और बाधाओं के अलावा कुछ भी नहीं मार दिया है। सामान्य आधार यह है कि ListView में कुछ पंक्ति है (चाहे वह एडेप्टर द्वारा बनाई गई है, या हेडर व्यू के रूप में जोड़ा गया है) जिसमें एक EditText विजेट और Button शामिल हैं सामान्य रूप से अलग-अलग आइटमों पर चयनकर्ता को नेविगेट करने के लिए, मैं जो भी करना चाहता हूं, वह जॉगबॉल / तीर का उपयोग करने में सक्षम होता है, लेकिन जब मैं किसी विशेष पंक्ति पर जाता हूं – भले ही मुझे स्पष्ट रूप से पंक्ति की पहचान होनी चाहिए – जिस पर ध्यान देने योग्य है बच्चे, मैं चाहता हूं कि बच्चे को चयनकर्ता के साथ स्थिति का संकेत देने के बजाय फोकस लेना चाहिए।

मैंने कई संभावनाओं की कोशिश की है, और अब तक कोई किस्मत नहीं है

लेआउट:

 <ListView android:id="@android:id/list" android:layout_height="fill_parent" android:layout_width="fill_parent" /> 

शीर्ष लेख देखें:

 EditText view = new EditText(this); listView.addHeaderView(view, null, true); 

मान लें कि एडेप्टर में अन्य मद हैं, ऐरो कुंजियों का उपयोग सूची में ऊपर / नीचे चयन में ले जाएगा, जैसा कि अपेक्षित है; लेकिन जब हेडर पंक्ति में हो, तो यह चयनकर्ता के साथ भी प्रदर्शित होता है, और जॉगबॉल का उपयोग करके संपादन टेक्स्ट पर ध्यान केंद्रित करने का कोई तरीका नहीं है नोट: EditText पर टैप उस बिंदु पर केंद्रित होगा , हालांकि यह टचस्क्रीन पर निर्भर करता है, जो कि एक आवश्यकता नहीं होनी चाहिए।

ListView स्पष्ट रूप से इस संबंध में दो तरीके हैं:
1. setItemsCanFocus(true) : चयनकर्ता कभी प्रदर्शित नहीं होता है, लेकिन setItemsCanFocus(true) का उपयोग करते समय setItemsCanFocus(true) फ़ोकस कर सकते हैं। फोकस खोज एल्गोरिथ्म का पूर्वानुमान करना मुश्किल है, और कोई भी विज़ुअल फीडबैक (किसी भी पंक्तियों पर: ध्यान देने योग्य बच्चों या नहीं) जिस पर आइटम का चयन किया जाता है, दोनों ही उपयोगकर्ता को एक अप्रत्याशित अनुभव दे सकते हैं
2. setItemsCanFocus(false) : चयनकर्ता हमेशा गैर-स्पर्श-मोड में खींचा जाता है, और setItemsCanFocus(false) फ़ोकस कभी नहीं हो सकता – भले ही आप उस पर टैप करें।

मामलों को बदतर बनाने के लिए, editTextView.requestFocus() बुलाते हुए, सच बताता है, लेकिन वास्तव में संपादन टेक्स्ट फ़ोकस नहीं देता।

मैं जो कल्पना कर रहा हूं वह मूल रूप से 1 और 2 का एक संकर है, जहां सभी आइटम्स फोकसनीय हैं या नहीं, सूची की स्थापना के बजाय, मैं सूची में एक आइटम के लिए फ़ोकसॅक्बिलिटी सेट करना चाहता हूं, ताकि चयनकर्ता को निर्बाध रूप से चयन करने से बदलाव गैर-फोकसनीय वस्तुओं के लिए पूरी पंक्ति, और फोकस वाले बच्चों के लिए फोकस ट्री पर चलना

कोई लेने वाला?

वेब के समाधान से एकत्रित समाधान "ListView में फोकसबल संपादन टेक्स्ट"

क्षमा करें, मेरे अपने प्रश्न का उत्तर दिया यह सबसे सही या सबसे सुरुचिपूर्ण समाधान नहीं हो सकता है, लेकिन यह मेरे लिए काम करता है, और बहुत अच्छा उपयोगकर्ता अनुभव देता है। मैं ListView के लिए कोड को देखने के लिए देखा कि दो व्यवहार इतने अलग क्यों हैं, और इस सूची से ListView.java पर आए हैं:

  public void setItemsCanFocus(boolean itemsCanFocus) { mItemsCanFocus = itemsCanFocus; if (!itemsCanFocus) { setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); } } 

इसलिए, setItemsCanFocus(false) बुलाते समय, यह भी वंशज फोकसनीयता सेट कर रहा है जैसे कि कोई भी बच्चा ध्यान केंद्रित नहीं कर सकता यह बताता है कि मैं सिर्फ सूची वीज के आईएनटीम्स सेलेक्टेड mItemsCanFocus में mItemsCanFocus को कैसे टॉगल नहीं कर सकता – क्योंकि सूचीव्यू तब सभी बच्चों पर ध्यान केंद्रित कर रहा था।

मेरे पास अब क्या है:

 <ListView android:id="@android:id/list" android:layout_height="match_parent" android:layout_width="match_parent" android:descendantFocusability="beforeDescendants" /> 

मैं beforeDescendants उपयोग करता beforeDescendants क्योंकि चयनकर्ता को केवल तब ही खींचा जाता है जब beforeDescendants स्वयं (कोई बच्चा नहीं) फोकस होता है, इसलिए डिफ़ॉल्ट व्यवहार की आवश्यकता होती है कि सूची दृश्य पहले ध्यान केंद्रित करता है और चयनकर्ताओं को खींचता है।

तब ओनइम से चुने गए लिस्टनर में, जब से मैं जानता हूं कि कौन सी हेडर दृश्य मैं चयनकर्ता को ओवरराइड करना चाहता हूं (गतिशील रूप से यह निर्धारित करने के लिए और अधिक काम कर सकेंगे कि कोई भी पद एक फोकसएबल दृश्य होता है), मैं भावी फोकसैबिलिटी को बदल सकता हूं, और EditText पर फोकस सेट कर सकता हूं। और जब मैं उस शीर्षलेख से बाहर निकलता हूं, उसे इसे वापस दोबारा बदलें।

 public void onItemSelected(AdapterView<?> listView, View view, int position, long id) { if (position == 1) { // listView.setItemsCanFocus(true); // Use afterDescendants, because I don't want the ListView to steal focus listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); myEditText.requestFocus(); } else { if (!listView.isFocused()) { // listView.setItemsCanFocus(false); // Use beforeDescendants so that the EditText doesn't re-take focus listView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); listView.requestFocus(); } } } public void onNothingSelected(AdapterView<?> listView) { // This happens when you start scrolling, so we need to prevent it from staying // in the afterDescendants mode if the EditText was focused listView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); } 

टिप्पणी-आउट setItemsCanFocus कॉल को नोट करें उन कॉलों के साथ, मुझे सही व्यवहार मिला, लेकिन setItemsCanFocus(false) ने setItemsCanFocus(false) से कूदने के लिए, सूची दृश्य के बाहर दूसरे विजेट पर, वापस सूची दृश्य पर चयन किया और अगले चयनित आइटम पर चयनकर्ता को प्रदर्शित किया, और यह कि जंपिंग फोकस ध्यान भंग। ItemsCanFocus परिवर्तन को हटाने, और सिर्फ वंशज फोकसटाइजिंग के लिए मुझे वांछित व्यवहार मिला सभी आइटम चयनकर्ता को सामान्य रूप से आकर्षित करते हैं, लेकिन जब संपादन टेक्स्ट के साथ पंक्ति को प्राप्त होता है, तो इसके बजाय पाठ फ़ील्ड पर ध्यान केंद्रित किया जाता है। फिर उस संपादन टेक्स्ट से बाहर निकलने पर, फिर से चयनकर्ता को फिर से शुरू करना शुरू हो गया।

यह मेरी मदद की
आपके मेनिफेस्ट में:

 <activity android:name= ".yourActivity" android:windowSoftInputMode="adjustPan"/> 

मेरा कार्य ListView को कार्यान्वित करना था, जिस पर क्लिक किया गया था। अतिरिक्त स्थान EditText टेक्स्ट दिखाता है जहां आप कुछ पाठ इनपुट कर सकते हैं। ऐप 2.2+ पर कार्यात्मक होना चाहिए (यह लिखने के समय 4.2.2 तक)

मैंने इस पोस्ट के कई समाधानों की कोशिश की और दूसरों को मैं मिल सकता था; 2.2 पर 4.2.2 उपकरणों तक उनका परीक्षण किया। किसी भी समाधान से सभी उपकरणों 2.2+ पर संतुष्टिदायक नहीं था, प्रत्येक समाधान को विभिन्न समस्याओं के साथ प्रस्तुत किया गया था।

मैं अपना अंतिम समाधान साझा करना चाहता था:

  1. android:descendantFocusability="afterDescendants" लिए सूची android:descendantFocusability="afterDescendants" सेट करें android:descendantFocusability="afterDescendants"
  2. सेट setItemsCanFocus(true); सेट करने के लिए सूची setItemsCanFocus(true); सेट करें setItemsCanFocus(true);
  3. अपनी गतिविधि को android:windowSoftInputMode="adjustResize" सेट करें android:windowSoftInputMode="adjustResize" बहुत से लोग adjustPan सुझाव adjustPan लेकिन adjustResize बहुत बेहतर adjustResize देता है, बस अपने मामले में इसका परीक्षण करें adjustPan साथ आपको नीचे सूची मिलेगी उदाहरण के लिए अस्पष्ट। डॉक्स का सुझाव है कि ("यह आकार बदलने से आमतौर पर कम वांछनीय है") इसके अलावा 4.0.4 पर उपयोगकर्ता को नरम कीबोर्ड पर टाइप करना शुरू होने के बाद स्क्रीन को शीर्ष पर ले जाता है।
  4. 4.2.2 पर adjustResize करें adjustResize करें adjustResize फ़ोकस के साथ कुछ समस्याएं हैं समाधान इस धागे से rjrjr समाधान लागू करना है। यह डरावना लग रहा है लेकिन ऐसा नहीं है। और यह काम करता है कर के देखो।

अतिरिक्त 5. एडेप्टर ताज़ा होने के कारण (देखने के आकार के कारण) जब EditText प्री हनीकॉम्ब संस्करण पर ध्यान केंद्रित करता है, तो मुझे उलट विचारों के साथ एक समस्या मिली: सूची दृश्य वस्तु के लिए दृश्य प्राप्त करना / 2.2 पर रिवर्स ऑर्डर; 4.0.3 पर काम करता है

यदि आप कुछ एनिमेशन कर रहे हैं तो आप पूर्व-मधुकोश संस्करणों के लिए adjustPan लिए व्यवहार को बदलना चाह सकते हैं जिससे कि आकार बदल नहीं होता और अनुकूलक विचारों को ताज़ा नहीं करता। आपको इस तरह कुछ जोड़ने की जरूरत है

 if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); 

यह सब 2.2 – 4.2.2 उपकरणों पर स्वीकार्य ux देता है। आशा है कि यह लोगों को कुछ समय बचाएगा क्योंकि इस निष्कर्ष पर आने के लिए मुझे कम से कम कई घंटे लग गए थे।

यह मेरा जीवन बचाया —>

  1. इस लाइन को सेट करें

    ListView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

  2. फिर अपने टैग में गतिविधि टैग प्रकार में यह ->

    <activity android:windowSoftInputMode="adjustPan">

आपका सामान्य इरादा

हम एक छोटी सूची पर यह कोशिश कर रहे हैं जो रीसाइक्लिंग के किसी भी दृश्य को नहीं करता है। अब तक सब ठीक है।

एक्सएमएल:

 <RitalinLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/cart_list" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbarStyle="outsideOverlay" /> </RitalinLayout> 

जावा:

 /** * It helps you keep focused. * * For use as a parent of {@link android.widget.ListView}s that need to use EditText * children for inline editing. */ public class RitalinLayout extends FrameLayout { View sticky; public RitalinLayout(Context context, AttributeSet attrs) { super(context, attrs); ViewTreeObserver vto = getViewTreeObserver(); vto.addOnGlobalFocusChangeListener(new ViewTreeObserver.OnGlobalFocusChangeListener() { @Override public void onGlobalFocusChanged(View oldFocus, View newFocus) { if (newFocus == null) return; View baby = getChildAt(0); if (newFocus != baby) { ViewParent parent = newFocus.getParent(); while (parent != null && parent != parent.getParent()) { if (parent == baby) { sticky = newFocus; break; } parent = parent.getParent(); } } } }); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (sticky != null) { sticky.requestFocus(); } } }); } } 

यह पोस्ट बिल्कुल मेरे खोजशब्दों से मिलान कर रहा था। मेरे पास एक खोज EditText और एक खोज बटन के साथ एक ListView हेडर है I

शुरुआती फोकस को खोने के बाद EditText पर ध्यान देने के लिए केवल एक ही हैक जिसे मैंने पाया है:

  searchText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // LOTS OF HACKS TO MAKE THIS WORK.. UFF... searchButton.requestFocusFromTouch(); searchText.requestFocus(); } }); 

बहुत घंटे खो गए और यह एक वास्तविक तय नहीं है आशा है कि यह किसी को मुश्किल में मदद करता है

यदि सूची गतिशील है और ध्यान देने योग्य विजेट शामिल है, तो सही विकल्प का उपयोग सूचीइच्छा आईएमओ के बजाय रीसाइक्लेअरव्यू का उपयोग करना है।

वे समाधान जो कि adjustPan , FOCUS_AFTER_DESCENDANTS सेट adjustPan , या मैन्युअल रूप से ध्यान केंद्रित स्थिति को याद करते हैं, वास्तव में केवल FOCUS_AFTER_DESCENDANTS हैं उनके पास कोने के मामले हैं (स्क्रॉलिंग + सॉफ्ट कीबोर्ड समस्याएं, संपादन टेक्स्ट में कैरेट बदलती स्थिति) वे इस तथ्य को नहीं बदलेगा कि ListView द्वारा सूचित किए गए / डेटा को नष्ट करने के दौरान notifyDataSetChanged को नष्ट कर देता है notifyDataSetChanged

रीसाइक्लियर व्यू के साथ, आप व्यक्तिगत आवेषण, अद्यतन, और हटाए जाने के बारे में सूचित करते हैं। केंद्रित दृश्य का पुन: निर्माण नहीं किया जा रहा है ताकि फॉर्म्स नियंत्रणों के साथ कोई समस्या फोकस खो न हो। एक अतिरिक्त बोनस के रूप में, रीसाइक्लर दृश्य सूची वस्तु प्रविष्टि और निष्कासन को एनिमेट करता है।

यहां रीसाइक्लियर व्यू के साथ आरंभ करने के बारे में आधिकारिक दस्तावेज़ों का एक उदाहरण है: http://developer.android.com/training/material/lists-cards.html

कुछ समय जब आप android:windowSoftInputMode="stateAlwaysHidden" उपयोग करते हैं android:windowSoftInputMode="stateAlwaysHidden" गतिविधि या एक्सएमएल में android:windowSoftInputMode="stateAlwaysHidden" , उस समय कीबोर्ड फोकस खो जाएगा तो पहले अपने एक्सएमएल और मैनिफेस्ट में उस संपत्ति की जांच करें, अगर यह वहां है तो इसे हटा दें android:windowSoftInputMode="adjustPan" ओर की ओर वाली गतिविधि में मैनिफ़ेस्ट फ़ाइल को जोड़ने के बाद android:windowSoftInputMode="adjustPan" और इस प्रॉपर्टी को एक्सएमएल android:descendantFocusability="beforeDescendants" में देखने के लिए जोड़ें android:descendantFocusability="beforeDescendants"

अपने ListAdapter के GetView (..) विधि में, अपने ऑनक्लिकलिस्ट को परिभाषित करना एक और आसान उपाय है।

 public View getView(final int position, View convertView, ViewGroup parent){ //initialise your view ... View row = context.getLayoutInflater().inflate(R.layout.list_item, null); ... //define your listener on inner items //define your global listener row.setOnClickListener(new OnClickListener(){ public void onClick(View v) { doSomethingWithViewAndPosition(v,position); } }); return row; 

इस तरह से आपकी पंक्ति क्लिक करने योग्य और आपके आंतरिक दृश्य भी हैं 🙂

सबसे महत्वपूर्ण हिस्सा सूची सेल के लिए ध्यान केंद्रित करना है। विशेष रूप से Google टीवी पर सूची के लिए यह आवश्यक है:

सूची दृश्य की सेट इत्याम कननफोकस विधि चाल करती है:

 ... mPuzzleList = (ListView) mGameprogressView.findViewById(R.id.gameprogress_puzzlelist); mPuzzleList.setItemsCanFocus(true); mPuzzleList.setAdapter(new PuzzleListAdapter(ctx,PuzzleGenerator.getPuzzles(ctx, getResources(), version_lite))); ... 

मेरी सूची सेल xml इस तरह से शुरू होता है:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/puzzleDetailFrame" android:focusable="true" android:nextFocusLeft="@+id/gameprogress_lessDetails" android:nextFocusRight="@+id/gameprogress_reset" ... 

nextFocusLeft / सही डी-पैड नेविगेशन के लिए भी महत्वपूर्ण हैं।

अधिक जानकारी के लिए महान अन्य उत्तर देखें

मुझे एक और हल मिला मेरा मानना ​​है कि यह समाधान से अधिक हैक है, लेकिन यह एंड्रॉयड 2.3.7 और एंड्रॉइड 4.3 पर काम करता है। (मैंने यह भी अच्छा पुराने डी पैड की जांच की है)

हमेशा की तरह अपने वेबव्यू को इनटेट करें और इसे जोड़ें: (धन्यवाद माइकल बिअर्मन)

 listView.setItemsCanFocus(true); 

GetView कॉल के दौरान:

 editText.setOnFocusChangeListener( new OnFocusChangeListener(View view,boolean hasFocus){ view.post(new Runnable() { @Override public void run() { view.requestFocus(); view.requestFocusFromTouch(); } }); 

बस यह कोशिश करो

 android:windowSoftInputMode="adjustNothing" 

में

गतिविधि

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