Listview में EditText Android 4.x पर दबाए जाने पर फोकस खो देता है




android-listview android-edittext (6)

मुझे पता है कि यहां बहुत सारे प्रश्न हैं लेकिन मुझे एक सरल नमूना ऐप में काम करने वाले प्रदत्त समाधानों में से कोई भी नहीं मिला।

समस्या तब होती है जब सॉफ्टकीबोर्ड पहली बार दिखाया जाता है। जैसे ही यह दिखाया गया है, केवल संपादन टेक्स्ट दबाकर इसे संपादन योग्य बनाता है।

निम्नलिखित का प्रयास किया:

 android:windowSoftInputMode="adjustPan|adjustResize"

यह किसी भी मुद्दे को हल नहीं कर रहा है। ऐसा लगता है कि सॉफ़्टकीबोर्ड पॉप अप होने के बाद गतिविधि को आकार देने के लिए यह लाइन अनिवार्य है। दुर्भाग्यवश, यह किसी भी संपादन टेक्स्ट को फोकस खोने का भी कारण बन रहा है। यह संभवतया सूची दृश्य के बाद आकार बदलने के बाद ध्यान केंद्रित कर रहा है। तो मैंने निम्नलिखित कार्यवाही की कोशिश की:

 listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

यह हमेशा पहले दृश्यमान संपादन टेक्स्ट का कारण बनता है जो ListView में फोकस हासिल करने के लिए होता है, जो अवांछनीय है। दूसरी पंक्ति में दूसरा संपादन टेक्स्ट आगे दबाए जाने पर ध्यान केंद्रित करना चाहिए, जो नहीं हो रहा है। इसके अलावा, अगर मैं अंत में एक और softkeyboard अन्य पर केंद्रित करने में कामयाब रहा तो पहला दिखाया गया (उदाहरण के लिए softkeyboard पर 'अगला' दबाकर), कीबोर्ड के खारिज होने के बाद पहले दृश्यमान को फोकस प्राप्त होगा और सूची दृश्य को फिर से पूर्ण आकार में बदल दिया जाएगा ।

मैंने ListView के लिए onFocusChange() घटनाओं को अवरुद्ध करने जैसी कई अन्य चीजों की कोशिश की, जबकि यह जानकर कि किस TouchListener द्वारा TouchListener दबाया गया था। उस निश्चित संपादन टेक्स्ट के लिए फ़ोकस का अनुरोध करने से फिर से कोई सफलता नहीं मिली।

किसी अन्य ListView द्वारा सुझाए गए ListView बजाय ScrollView का उपयोग करना संबंधित परियोजना के लिए एक विकल्प नहीं है।


अपनी गतिविधि में windowSoftInputMode जोड़ने के लिए अपने मेनिफेस्ट xml को संशोधित करें:

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

इस तरह की स्थितियों के लिए एक क्लासिक हैक एक हैंडलर और postDelayed() । आपके एडाप्टर में:

private int lastFocussedPosition = -1;
private Handler handler = new Handler();

public View getView(final int position, View convertView, ViewGroup parent) {

    // ...

    edittext.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                handler.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        if (lastFocussedPosition == -1 || lastFocussedPosition == position) {
                            lastFocussedPosition = position;
                            edittext.requestFocus();
                        }
                    }
                }, 200);

            } else {
                lastFocussedPosition = -1;
            }
        }
    });

    return convertView;
}

यह मेरे डिवाइस पर काम करता है, लेकिन इस कोड को उत्पादन से बाहर रखें। मैं भी आश्चर्यचकित नहीं होगा अगर फोकस बग अलग-अलग एंड्रॉइड संस्करणों या रोम में अलग-अलग दिखाई देता है।

ListView EditText को एम्बेड करने के साथ कई अन्य समस्याएं भी हैं जिनके पास एक हैक जैसा समाधान है। संघर्ष करने वाले सभी other people को देखें।

ऐसा कुछ भी करना बहुत आसान है:

कई बार अपने आप को समान पथ छोड़ने के बाद, मैंने ज्यादातर डिफ़ॉल्ट कीबोर्ड व्यवहार या quirks को ओवरराइड करने की कोशिश करने पर छोड़ दिया है। यदि संभव हो तो मैं आपके ऐप में वैकल्पिक समाधान खोजने की कोशिश करूँगा।

क्या आपने माना है कि ListView पंक्तियां केवल एक स्टाइल TextView और फिर एक पंक्ति क्लिक होने पर एक EditText साथ एक Dialog प्रदर्शित कर रहा है, टेक्स्टव्यू को आवश्यकतानुसार अपडेट कर रहा है?


जब मैं ListView पंक्ति में स्थित एडिटटेक्स्ट पर दबाता हूं तो मुझे एक्शनबार "चोरी" फोकस में समस्याएं आ रही थीं। उपर्युक्त समाधान काम नहीं करते थे, लेकिन निम्नलिखित समाधान मेरे लिए काम करते थे:

http://www.mysamplecode.com/2013/02/android-edittext-listview-loses-focus.html

असल में मैंने इसे अपनी सूची दृश्य में जोड़ा:

android:descendantFocusability="beforeDescendants"

और इसे मेरी गतिविधि में जोड़ा:

android:windowSoftInputMode="adjustPan"

जब सूची नरम कीबोर्ड को कवर करने के लिए काफी लंबी होती है, तो एंड्रॉइड 4.x पर दबाए जाने पर EditText में EditText फोकस खो देता है।

एक समाधान आधा स्क्रीन की ऊंचाई के साथ एक रैखिक लेआउट में Listview लपेटना है।

जब भी Listview सॉफ्टकीबोर्ड को कवर नहीं करता है, सब कुछ ठीक है।


मेरे मामले में मैंने अपने एडाप्टर में वर्तमान में स्थानीय मूल्य जोड़ा है। विधि में देखें व्यू () मैंने इन कोड को प्रत्येक संपादन में जोड़ दिया है टेक्स्ट:

   if (currentlyFocusedRow == position) {
        editText.requestFocus();
   }

        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    if (currentlyFocusedRow == -1) {
                        currentlyFocusedRow = position;
                    }
                } else {
                    currentlyFocusedRow = -1;
                }
            }
        });

मैं इसे एक बहुत पुराना धागा जानता हूं लेकिन यह उत्तर किसी के लिए सहायक हो सकता है, इसलिए यह है:

RecyclerView पर स्विच करें और आपको ListView के इन परेशान मुद्दों के बारे में चिंता करने की आवश्यकता नहीं होगी। नया दृश्य बनाने के बजाय यह पुराने विचारों को पुन: उपयोग और पुन: उपयोग करता है।





ontouchlistener