android - एंड्रॉइड: डायलॉग में एडिटटेक्स्ट सॉफ्ट कीबोर्ड नहीं खींचता है



5 Answers

मुझे अपने ऐप में एक ही समस्या है। यदि आप API स्तर> = 8 के लिए विकसित कर रहे हैं तो आप इस स्निपेट का उपयोग कर सकते हैं:

dialog.setOnShowListener(new OnShowListener() {
    @Override
     public void onShow(DialogInterface dialog) {
         InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
         imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
    }
});

मुझे कम एपीआई स्तरों के लिए समाधान नहीं मिला है ...

बीटीडब्ल्यू: यह स्निपेट हमेशा एमुलेटर पर काम नहीं करता है। मुझे नहीं पता क्यों।

android dialog android-edittext android-softkeyboard

तो मुझे लगता है कि एक आम समस्या क्या प्रतीत होती है, जो कि मेरे डायलॉग बॉक्स में एडिटटेक्स्ट फोकस होने पर दिखाई नहीं देता है। मैंने इस धागे में कई कामकाज देखे हैं, यह एक और यह एक (और कई और), लेकिन मैंने कभी भी संतोषजनक स्पष्टीकरण नहीं देखा है कि यह पहली जगह क्यों हो रहा है।

मैं एंड्रॉइड को अपना खुद का निर्माण करने के बजाय एडिटटेक्स के लिए अपने स्वयं के डिफ़ॉल्ट व्यवहार का उपयोग करना पसंद करूंगा, लेकिन ऐसा लगता है कि हर किसी (उन धागे में) ने स्वीकार किया है कि संवाद में संपादन टेक्स्ट के लिए डिफ़ॉल्ट व्यवहार सिर्फ कर्सर और कोई कीबोर्ड नहीं देना है। वह क्यों होगा?

रिकॉर्ड के लिए, इनमें से कोई भी कामकाज मेरे लिए काम नहीं कर रहा है - निकटतम मैं आने में सक्षम हूं, एक संवाद कुंजीपटल बॉक्स के नीचे दिखाई देने के लिए मजबूर कर रहा है (InputMethodManager.toggleSoftKeyboard (*) का उपयोग करके)। मेरा विशेष कॉन्फ़िगरेशन API15 है, एडिटटेक्स्ट एक अलर्टडिअलॉग के भीतर ListView पर एक पाद लेख में दिखाई देता है। एडिटटेक्स्ट एंड्रॉइड: फोकस करने योग्य = "सच्चा" सेट है, और फोकस चेंजलिस्टर फोकस इवेंट प्राप्त कर रहा है।

संपादित करें:

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

 <RelativeLayout 
       android:id="@+id/relLay"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:visibility="gone"
       android:layout_marginTop="5dp"
       android:layout_marginBottom="5dp">

        <ImageButton
            android:id="@+id/cancelBut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:background="@color/transparent"
            android:src="@drawable/cancelButton" 
            android:layout_margin="5dp"/>

        <ImageButton
            android:id="@+id/okBut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/cancelBut"
            android:background="@color/transparent"
            android:src="@drawable/okButton"
            android:layout_margin="5dp" />

        <EditText 
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="text"
            android:focusable="true"
            android:layout_toLeftOf="@id/okBut"/>
   </RelativeLayout>

यह कोड जो बनाता है वह "दृश्यमान" (और अन्य UI तत्वों को छुपाता है) के सापेक्ष Layout की दृश्यता सेट करता है। EditText के साथ अपने अनुभव के आधार पर, संपादन टेक्स्ट को ध्यान केंद्रित करने पर कीबोर्ड को खींचने के लिए पर्याप्त होना चाहिए । हालांकि, किसी कारण से यह मामला नहीं है। मैं निम्नलिखित पर फ़ोकस चेंजलिस्ट सेट कर सकता हूं:

    edit_text.setOnFocusChangeListener(new OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                // For whatever reason we need to request a soft keyboard.
                    InputMethodManager imm = (InputMethodManager)dlg.getWindow().getContext().getSystemService(_Context.INPUT_METHOD_SERVICE);
                    if(hasFocus)
                        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
                    Log.v("DialogProblem", "Focus requested, " + (hasFocus?"has focus.":"doesn't have focus."));
                }
            }
        });

इस कॉन्फ़िगरेशन का उपयोग करते समय, जब मैं पहली बार एडिटटेक्स्ट दर्ज करता हूं, तो ऑनफोकस चेंज लिस्टर ट्रिगर्स करता है, और ऐसा लॉग उत्पन्न करता है जो हमेशा ऐसा दिखता है:

Focus requested, has focus.
Focus requested, doesn't have focus.
Focus requested, has focus.

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

उस ने कहा, मैं इस बात पर ज़ोर देना चाहूंगा कि भले ही मैं काम करने के लिए इस काम को प्राप्त कर सकूं, मैं मुख्य रूप से एक साधारण कारण खोजने में रूचि रखता हूं कि क्यों संपादन टेक्स्ट पहले स्थान पर ट्रिगर नहीं कर रहा है, और यह क्यों ऐसा लगता है कि इतना आम है!




उपरोक्त कोड बहुत उपयोगी है। लेकिन आपको "बनाने" विधि के बाद "शो" विधि को कॉल करना होगा (मुझे नहीं पता क्यों, लेकिन केवल यह सूची दृश्य में EditText के साथ मेरे संवाद में काम करता है)। क्रिएटडिअलॉग पर विधि में:

@Override
protected Dialog onCreateDialog(int id) {
  switch (id) {
    case YOUR_DIALOG_ID: {
        //...
        AlertDialog a = new AlertDialog.Builder(this)./*
        ... set the properties here
        */
        .create();
        a.show(); //!!! this is very important to call the "show" method
        a.getWindow().clearFlags(
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
        return a;
    }
  //...
  }
  return null;
}



इसी से मेरा काम बना है। AlertDialog.builder, शीर्षक सेट करें, पॉजिटिव बटन, नकारात्मक बटन बनाएँ। ऐसा करने के बाद:

    AlertDialog dialog = builder.create();
    dialog.getWindow().clearFlags( WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    dialog.show();
    editText.requestFocus();

आपको builder.show(); का उपयोग करने की आवश्यकता नहीं है builder.show();




मैं पॉल के जवाब और अलेक्जेंडर की टिप्पणी को जोड़ना चाहता हूं।

मेरे पास एक संवाद है जो dialog.show(); विधि में बनाया गया है, जो (लगता है) वापस लौटने की आवश्यकता है। dialog.show(); , इसलिए आप उस संवाद में लेआउटपरैम नहीं जोड़ सकते जहां संवाद बनाया गया है। इसके आस-पास काम करने के लिए, बस अपनी onResume() विधि को वही रखें, और onResume() एक onResume() विधि जोड़ें:

@Override
public void onResume() {
    super.onResume();
    Dialog dialog = getDialog();
    dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}

यह चाल चलनी चाहिए, यह मेरे लिए काम करता है, शुक्र है। कुछ समय के लिए इस मामले पर रहे हैं।




This worked for me ----
editText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
//dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
//dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
InputMethodManager mgr = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(v, InputMethodManager.SHOW_FORCED);
editText.setFocusable(true);
}
});





Related