ListView के अंदर ध्यान देने योग्य EditText


121

मैंने इस पर अब तक लगभग 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जॉगबॉल का उपयोग करने पर ध्यान केंद्रित करने का कोई तरीका नहीं है । नोट: EditText वसीयत पर टैप करने से यह उस बिंदु पर केंद्रित होगा , हालांकि यह एक टचस्क्रीन पर निर्भर करता है, जिसकी आवश्यकता नहीं होनी चाहिए।

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

मामलों को बदतर बनाने के लिए, editTextView.requestFocus()रिटर्न को सही कहना, लेकिन वास्तव में EditText को ध्यान नहीं देता है।

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

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

जवाबों:


101

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

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

इसलिए, फोन करते समय setItemsCanFocus(false), यह वंशज फ़ोकसबिलिटी को भी सेट कर रहा है , ताकि किसी बच्चे को फ़ोकस न मिले। यह बताता है कि मैं सिर्फ mItemsCanFocusListViews के OnItemSelectedListener में टॉगल नहीं कर सका - क्योंकि ListView तब सभी बच्चों पर ध्यान केंद्रित कर रहा था।

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

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

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

फिर OnItemSelectedListener में, क्योंकि मुझे पता है कि मैं किस हेडर दृश्य को चयनकर्ता को ओवरराइड करना चाहता हूं (यह गतिशील रूप से यह निर्धारित करने के लिए अधिक काम लेगा कि किसी भी स्थिति में फ़ोकस करने योग्य दृश्य शामिल है), मैं वंशावली फ़ोकस करने योग्यता को बदल सकता हूं, और 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)एडिटटेक्स्ट से लिस्टव्यू के बाहर दूसरे विजेट पर, लिस्ट व्यू के बाहर किसी अन्य विजेट पर ध्यान केंद्रित करने और अगले चयनित आइटम पर चयनकर्ता को प्रदर्शित करने पर ध्यान केंद्रित करने का कारण बना, और यह कि कूद का ध्यान भंग हो रहा था। ItemCanFocus परिवर्तन को हटाने, और बस टॉगल वंश ध्यान केंद्रित करने से मुझे वांछित व्यवहार मिला। सभी आइटम चयनकर्ता को सामान्य रूप से आकर्षित करते हैं, लेकिन जब EditText के साथ पंक्ति में जाते हैं, तो इसके बजाय पाठ फ़ील्ड पर ध्यान केंद्रित किया जाता है। फिर जब उस EditText को जारी रखा, तो उसने चयनकर्ता को फिर से चित्रित करना शुरू कर दिया।


बहुत अच्छा, अभी तक परीक्षण नहीं किया गया। क्या आपने 1.5, 1.6 और 3.0 पर परीक्षण किया है?
राफेल सेंचुरी

राफेल सांचे: मैंने 2.1 से परियोजना को नहीं छुआ है, लेकिन उस समय, यह 1.5, 1.6 और 2.1 में काम करने की पुष्टि की गई थी। मैं कोई गारंटी नहीं देता कि यह अभी भी 2.2 या बाद में काम करता है।
जो

13
केवल Android आवश्यक है: descendantFocusability = "afterDescendants" - वैसे भी +1
kellogs

5
@kellogs: हाँ, descendantFocusability="afterDescendants"अपने EditText को ListView के अंदर फ़ोकस करने की अनुमति देगा, लेकिन फिर आपको dpad के साथ नेविगेट करते समय कोई सूची आइटम चयनकर्ता नहीं मिलता है । मेरा कार्य सभी पंक्तियों पर सूची आइटम चयनकर्ता को एडिटटेक्स्ट के अलावा एक को छोड़कर करना था। खुशी है कि यह मदद की। एफडब्ल्यूआईडब्ल्यू, हमने इस कार्यान्वयन को पुनर्मूल्यांकन समाप्त कर दिया और फैसला किया कि लिस्ट व्यू के अंदर एक ध्यान देने योग्य सिर्फ मुहावरेदार-एंड्रॉइड यूआई डिज़ाइन नहीं है, इसलिए हमने अधिक एंड्रॉइड-अनुकूल दृष्टिकोण के पक्ष में विचार को समाप्त कर दिया।
जो

5
क्या यह आइसक्रीम सैंडविच पर परीक्षण किया गया है? मैं इसे काम नहीं कर सकता। धन्यवाद।
रजत अनंतराम

99

इससे मुझे मदद मिली।
आपके प्रकट में:

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

3
मुझे यकीन नहीं है कि मैं प्रासंगिकता देख रहा हूं। WindowSoftInputMode को सेट करने से IME खुले होने पर बाकी विंडो सामग्री को समायोजित करने के तरीके को बदल देता है। यह आपको सूची के फोकस प्रकार को चुनिंदा रूप से बदलने की अनुमति नहीं देता है। क्या आप थोड़ा और समझा सकते हैं, यह प्रारंभिक उपयोग के मामले से कैसे संबंधित है?
जो

1
@Joe जब IME खोला जाता है, तो कर्सर - और शायद फ़ोकस, भी - बस मेरी स्क्रीन में इधर-उधर कूदता है, जिससे इनपुट टेक्स्ट के लिए असंभव हो जाता है। आपका OnItemSelectedListenerवह परिवर्तन नहीं है। हालाँकि, Iogan का सरल समाधान आकर्षण की तरह काम करता है, धन्यवाद!
गबेल

2
@ ग्लबेल: वास्तव में, यह बिल्कुल भी नहीं बदलेगा, क्योंकि मूल प्रश्न कुछ अलग तरह का था। ग्लैड लोगान की फिक्स चीजें जो आप ढूंढ रहे थे, उसके लिए काम करता है, लेकिन यह बस सवाल से संबंधित दूर से भी नहीं है।
जो

8
इस प्लस का उपयोग करते हुए, जो की android:descendantFocusabilityसंपत्ति ने कीबोर्ड को ठीक से हल करने के EditTextअंदर मेरा एस प्राप्त किया ListView, दोनों को उखाड़ दिया। android:descendantFocusabilityअपने आप से चाल नहीं चली और मैं @Overriding onItemSelectedउन सभी 14 के बारे में दूर से उत्साही नहीं था जिनसे EditTextमुझे निपटना है। :) धन्यवाद!
थॉमसन कॉमर जूल

यह मेरे लिए काम करता है, लेकिन ध्यान दें कि यदि आप TabHost या TabActivity का उपयोग कर रहे हैं, तो आपको मैनिफ़ेस्ट में TabActivity की परिभाषा के लिए android: windowSoftInputMode = "adjustPan" सेट करना होगा।
किडक्स

18

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

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

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

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

ArrayAdapter में मेरे xElement.setOnClickListener (..) के साथ पूरी तरह से काम करता है और एक ListView.setOnItemClickListener (...) - अंत में !! बड़ा thx।
जावतार

10

इससे मेरी जान बच गई --->

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

    ListView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

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

    <activity android:windowSoftInputMode="adjustPan">

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


7

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

एक्सएमएल:

<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();
        }
      }
    });
  }
}

थोड़ा संशोधित, मेरे लिए काम करता है इस समाधान का 2 दिनों के बाद @ # ( : अगर (चिपचिपा = नल) {sticky.RequestFocus (); sticky.RequestFocusFromTouch (); चिपचिपा = बातिल;}!
क्रिस वैन डे Steeg

4

यह पोस्ट बिल्कुल मेरे कीवर्ड्स से मेल खा रही थी। मेरे पास एक खोज एडिट टेक्स्ट और एक खोज बटन के साथ एक सूची दृश्य हेडर है।

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

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

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


2

यदि सूची गतिशील है और इसमें फ़ोकस करने योग्य विजेट शामिल हैं, तो सही विकल्प सूची दृश्य IMO के बजाय RecyclerView का उपयोग करना है ।

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

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

आरंभिक मार्गदर्शिकाRecyclerView : डेवलपर गाइड - RecyclerView के साथ एक सूची बनाएं पर आधिकारिक डॉक्स से एक उदाहरण यहां दिया गया है


1

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


0

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

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;

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


1
सवाल फोकस से संबंधित है, क्लिक करने की क्षमता से नहीं।
जो

0

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

सूची दृश्य की setItemsCanFocus विधि चाल करती है:

...
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"
...

अगला-फ़ोकसलेफ्ट / राइट डी-पैड नेविगेशन के लिए भी महत्वपूर्ण है।

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


0

मुझे बस एक और उपाय मिला। मेरा मानना ​​है कि यह एक समाधान से अधिक हैक है, लेकिन यह एंड्रॉइड 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();
            }
     });

यहाँ view.requestFocus में क्या है?
नरेन्द्र सिंह

यह एक पुराना उत्तर है, लेकिन इसने ओनफोकस चेंजलिस्टनर के तर्क के रूप में दिए गए दायरे के दृश्य का उल्लेख किया है, मेरा मानना ​​है कि
alaeri

1
यह फोकस बदलने में एक लूप का कारण बनता है।
मोर्टेजा रस्तगो

0

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

android:windowSoftInputMode="adjustNothing"

में

गतिविधि

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.