जब AlertDialog.Builder को EditText के साथ उपयोग किया जाता है, तो सॉफ्ट कीबोर्ड पॉप नहीं करता है


117

मैं इनपुट विधि के रूप में EditText के साथ इनपुट बॉक्स बनाने के लिए AlertDialog.Builder का उपयोग कर रहा हूं ।

दुर्भाग्य से, सॉफ्ट कीबोर्ड पॉप नहीं करता है, हालांकि EditText फोकस में है, जब तक कि आप इसे फिर से स्पष्ट रूप से स्पर्श नहीं करते हैं।

क्या इसे पॉप करने के लिए मजबूर करने का एक तरीका है?

मैंने (AlertDialog.Builder) .show () के बाद , निम्नलिखित की कोशिश की है ; लेकिन कोई फायदा नहीं हुआ।

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

कोई मदद कर सकता है?

धन्यवाद!!


1
कृपया अपने स्रोत कोड को प्रारूपित करें।
दीक्षा 7

तब मैं आप के साथ-साथ वोट दें :) मैं कई घंटे और grine4ka से पिछले जवाब के लिए एक ही समस्या खोज था अच्छा काम करता है
फिलिप

जवाबों:


222

मैंने ऐसा काम किया है

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

dialog.show();

3
बहुत बहुत धन्यवाद। मैंने अभी कुछ समय खोजा है और यही वह तरीका है जो आप जाना चाहते हैं। सभी OnFocusChangeListenerदृष्टिकोण मुझे बहुत लगते हैं और परेशानी का कारण बनते हैं। आपको बनाना होगाAlertDialog लिए है AlertDialog.Builder!
दीक्षा 7

क्या यह वास्तव में एक समाधान है? यह सिर्फ कीबोर्ड को दिखाने के लिए मजबूर करता है, भले ही इनपुट क्षेत्र हो या न हो, अगर इनपुट क्षेत्र पर ध्यान केंद्रित है या नहीं, है ना? =)
टेड

@ यह सही होने पर कि यह वास्तविक समाधान नहीं है, लेकिन यह काम करता है। मैंने ऐसा काम करने की कोशिश की है अगर संवाद में कोई एडिटटेक्स्ट नहीं है, और सॉफ्ट कीबोर्ड दिखाई नहीं दिया।
grine4ka

1
मैं वास्तव में "इसे हल करने" (वर्कअराउंड) का प्रबंधन करता हूं। मैं EditText के लिए setOnFocusChangeListener का उपयोग करता हूं, और onFocusChange में अगर यह फोकस ("हैफोकस" var) है और यदि ऐसा है, तो मैं जांच करता हूं कि मैं getWindow () करता हूं।
टेड

1
नोट: काम करने के लिए इस के लिए, आप जगह की जरूरत है setSoftInputModeलाइन से पहले dialog.show() या यह काम नहीं करेगा। सरल सही समाधान btw के लिए +1
Spikatrix 8

29

मैं इसे इस तरह हल करने में कामयाब रहा हूं:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

23

मुझे पता चला कि टेबलेट पर समान कोड ठीक से काम करता है, कीबोर्ड पॉप अप करता है, लेकिन फोन पर ऐसा नहीं होता है, इसलिए आगे शोध करना, "समायोजन" विकल्प को इंगित करता है।

मैं इसका उपयोग कर रहा हूं, बहुत क्लीनर लगता है।

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();

धन्यवाद। यह उपयोग करने से बेहतर है SOFT_INPUT_STATE_ALWAYS_VISIBLE। जैसा कि SOFT_INPUT_STATE_ALWAYS_VISIBLEसंवाद के यूआई घटकों को अवरुद्ध करने जा रहा है, जहां संवाद SOFT_INPUT_ADJUST_RESIZEको आकार देने और "पुश अप" करने में सक्षम है।
चोक यान चेंग

10

मेरे मामले में जब मैं डायलॉग दिखा रहा था तब कीबोर्ड को दिखाने का एकमात्र तरीका मेरे द्वारा जोड़कर था DialogFragment:

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

नोट SOFT_INPUT_STATE_ALWAYS_VISIBLE के बजाय SOFT_INPUT_STATE_VISIBLE

प्रलेखन से:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.

यह एकमात्र समाधान था जो मेरे लिए काम करता था और मैंने उनमें से लोड की कोशिश की थी। मेरा एक एल्ड्रिऐडॉग बिल्डर से एक डायलफ्रैगमेंट बिल्ड था। महत्वपूर्ण बिट उपरोक्त कोड को onResume () में लगा रहा था। कहीं और यह सिर्फ काम नहीं किया!
user960914

6

जब आप onDreateDialog में AlertDialog का उपयोग करके बनाए गए डायलॉग को दिखाने के लिए showDialog को कॉल करते हैं

आपको यहां कोड डालना चाहिए

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
       @Override
       public void onFocusChange(View v, boolean hasFocus) {
         if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
         }
       }
    });

}

5

एक बेहतर समाधान यहाँ दिया गया है

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

कोई वर्कअराउंड नहीं। EditTextअपेक्षा के अनुरूप व्यवहार करता है।


इस एक ने मेरे लिए काम किया, दूसरा समाधान फोकस ला रहा था लेकिन कीबोर्ड प्रदर्शित नहीं किया गया था।
अक्षय

2
Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

इसका जवाब यहां पहले ही दिया जा चुका था। एक OnFocusChangeListener का उपयोग कर मेरे लिए काम किया।


सवाल पूछता है कि एक AlertDialog.Builder वस्तु के लिए सॉफ्ट इनपुट मोड कैसे सेट किया जाए, हालांकि आप जिस धागे को संदर्भित करते हैं, वह AlertDialog ऑब्जेक्ट का उपयोग करके एक उदाहरण देता है। अगर मैं सुझाए गए कोड का उपयोग करने की कोशिश करता हूं (OnFocusChangeListener के भीतर (अलर्ट .getWindow) का उपयोग करके।) ऑब्जेक्ट्स को ग्रहण करें जो विधि AlWDialog.Builder के लिए परिभाषित नहीं है। क्या आप मुझे इसे ठीक करने में मदद कर सकते हैं, कृपया
प्रीबग

1

मेरे मामले में, SoftInputMode प्रदर्शित नहीं हो रहा था जब मैंने इसे सेट किया था जो संवाद दिखाने से पहले था (इसे बनाने के बाद)। नीचे दिए गए कोड ने मेरे लिए काम किया जहां मैंने संवाद दिखाने के बाद SoftInputMode सेट किया।

Kotlin:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

जावा:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

मुझे आशा है कि यह किसी को भी मदद करता है जो मेरे समान ही समस्या थी।


0

यह कोशिश करो, यह मेरे लिए काम कर रहा है

यदि आप सॉफ्ट कीबोर्ड प्रदर्शित करना चाहते हैं:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

और यदि आप इसे छिपाना चाहते हैं:

  InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(input.getWindowToken(), 0);

0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

1
कोड के साथ कुछ संदर्भ / स्पष्टीकरण को शामिल करना बेहतर है क्योंकि यह उत्तर को ओपी के लिए और भविष्य के पाठकों के लिए अधिक उपयोगी बनाता है।
EJoshuaS -

0

यह समस्या तब होती है जब AlertDialog.onCreate को कॉल करने के बाद EditText जोड़ा जाता है।

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

AlertDialog क्लास आपके लिए android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM सेट करने के लिए स्वचालित रूप से ध्यान रखती है कि क्या संवाद में कोई दृश्य View.onCIIsTextEditor () से सही है।

आपको FLAG_ALT_FOCUSABLE_IM ध्वज साफ़ करना होगा।

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

क्योंकि AlertDialog.show को DialogFragment.onStart में कहा जाता है, आप DialogFragment.onStart में कोड डाल सकते हैं।

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

या यदि आप DialogFragment का उपयोग नहीं करते हैं तो आप Dialog.setOnShowListener का उपयोग कर सकते हैं।

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.