जब एडिटक्स्ट फोकस्ड हो तो सॉफ्ट-कीबोर्ड कैसे दिखाएं


461

मैं EditTextध्यान केंद्रित करने पर स्वचालित रूप से सॉफ्ट-कीबोर्ड दिखाना चाहता हूं (यदि डिवाइस में भौतिक कीबोर्ड नहीं है) और मुझे दो समस्याएं हैं:

  1. जब मुझे Activityप्रदर्शित किया जाता है, तो मेरा EditTextध्यान केंद्रित किया जाता है लेकिन कीबोर्ड प्रदर्शित नहीं होता है, मुझे कीबोर्ड को दिखाने के लिए उस पर फिर से क्लिक करना होगा (यह तब प्रदर्शित किया जाना चाहिए जब मेरा Activityप्रदर्शित हो)।

  2. और जब मैं कीबोर्ड पर किया जाता हूं, तो कीबोर्ड को हटा दिया जाता है, लेकिन EditTextध्यान केंद्रित रहता है और y नहीं चाहता (क्योंकि मेरा संपादन हो चुका है)।

फिर से शुरू करने के लिए, मेरी समस्या आईफोन पर कुछ और पसंद करने की है: जो कि कीबोर्ड को मेरे EditTextराज्य के साथ रखता है (केंद्रित / ध्यान केंद्रित नहीं) और निश्चित रूप से एक भौतिक कीबोर्ड होने पर सॉफ्ट-कीबोर्ड प्रस्तुत नहीं करता है।


मेरे पास बस एक बुनियादी EditText है जैसे: <EditText android: id = "@ id / myEditText" android: layout_width = "fill_parent" android: layout_height = "wra_content" android: imeOptions = "actionDone" /> और मेरी गतिविधि पर मेरे पास है यह: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
लुडोविक लैंड्री

2
इससे मुझे इस पोस्ट के किसी भी उत्तर से बेहतर मदद मिली: stackoverflow.com/a/2418314/1491212
आर्मेल लारिसर

जवाबों:


628

सॉफ्ट कीबोर्ड को प्रदर्शित करने के लिए मजबूर करने के लिए, आप उपयोग कर सकते हैं

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

और ध्यान हटाने के लिए EditText, दुख की बात है कि आपको Viewध्यान खींचने के लिए एक डमी की आवश्यकता है ।

आशा है कि ये आपकी मदद करेगा


इसे बंद करने के लिए आप उपयोग कर सकते हैं

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

यह एक संवाद में इसका उपयोग करने के लिए काम करता है

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}

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

157
मेरे लिए एक EditText के साथ एक संवाद में काम नहीं करता है जिसमें पहले से ही फोकस है। यकीन नहीं है कि क्यों।
मथियास

10
@AbdellahBenhammou, शायद सॉफ्टवेर इनपुट दिखाने से पहले अपने एडिट टेक्स्ट पर रिक्वेस्टफोकस कॉल करने से आपकी समस्या हल हो सकती है। इसने मेरे लिए किया।
r1k0

18
@AbdellahBenhammou, इसे अपने DialogFragment के onCreate (): getDialog ()। GetWindow ()। SetSoftInputMode (WindowManager.LayPParams.SOFT_INPUT_STATE_VISIBLE) में करें।
फिलिप

22
केवल yourEditText.requestFocus()यहाँ वर्णित के साथ संयोजन के रूप में काम किया : stackoverflow.com/questions/8991522/…
विवेक पाण्डेय

231

मुझे भी यही समस्या थी। GON से VISIBLE में editText दृश्यता परिवर्तन के तुरंत बाद, मुझे फोकस सेट करना था और सॉफ्ट कीबोर्ड प्रदर्शित करना था। मैंने निम्नलिखित कोड का उपयोग करके इसे हासिल किया:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

यह मेरे लिए 100ms देरी से काम करता है, लेकिन बिना किसी देरी के या केवल 1ms देरी से विफल हुआ।

कोड का टिप्पणी वाला हिस्सा एक और दृष्टिकोण दिखाता है, जो केवल कुछ उपकरणों पर काम करता है। मैंने ओएस संस्करणों 2.2 (एमुलेटर), 2.2.1 (वास्तविक डिवाइस) और 1.6 (एमुलेटर) पर परीक्षण किया।

इस दृष्टिकोण ने मुझे बहुत दर्द से बचाया।


48
मुझे नहीं पता था कि कुछ एक ही समय में इतना बदसूरत और इतना सुंदर हो सकता है। आपको बहुत - बहुत धन्यवाद!
मार्केले

15
@ जेलीफ़िश इस पर एक नल simulates EditText। इसे पढ़ने वाले अन्य लोगों के लिए, एक नया बनाने के बजाय Handlerआप विजेट पर ही View.postDelayed()विधि का उपयोग कर सकते हैं yourEditText
टोनी चैन

5
यह डेविड चैंडलर द्वारा किया गया एक हैक - बेहतर समाधान है।
बेन बेडसन

4
यदि डेविड चैंडलर का समाधान सभी एंड्रॉइड संस्करणों / उपकरणों के लिए काम करता है और इस मामले के लिए जब दृश्यता को केवल GIB से VISIBLE में बदल दिया गया था, तो YES - आपको इसके समाधान का उपयोग करना चाहिए।
माइक केसिनकोव

3
माना। क्या आप बेहतर समाधान जानते हैं जो सभी एंड्रॉइड फ्लेवर में काम करता है?
माइक केस्किनोव

162

कीबोर्ड को प्रदर्शित करने के लिए उपयोग करने के लिए

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

यह विधि InputMethodManager को सीधे लागू करने से अधिक विश्वसनीय है।

इसे बंद करने के लिए, का उपयोग करें

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

12
क्या कोई यह समझा सकता है कि यह सीधे तौर पर आह्वान करने की तुलना में अधिक विश्वसनीय क्यों है InputMethodManager? (एक के लिए, यह काम नहीं करता है, रुकोद्रुग के समाधान के विपरीत।)
मैथ्यू क्विरोस

5
मेरे लिए भी काम नहीं करता है। एंड्रॉइड 2.3.5 में काम करना। raukodraug का समाधान मेरे लिए काम करता है। संस्करण निर्भरता के लिए खोज की, लेकिन एक नहीं मिला।
ह्यूगो लोगमेन

2
इसने मेरे लिए एंड्रॉइड 4.4.2 में काम किया। इस पोस्ट के समाधान के रूप में चुने गए InputMethodManager विधि ने मेरे लिए काम नहीं किया।
फिल

उत्तर में विधि का उपयोग करने के बाद मैंने इसे जोड़ा और यह काम किया, लेकिन इसके बिना यह काम नहीं किया। thanx
Manny265

2
एंड्रॉइड 4.4.2 में मेरे लिए काम नहीं किया। यह कीबोर्ड दिखाता है, लेकिन इसे छिपा नहीं पाया।
जॉन जे स्मिथ

87

जब कुछ और काम न करे, तो उसे दिखाने के लिए मजबूर करें :

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

और फिर बाद में, यदि आप इसे बंद करना चाहते हैं, उदाहरण के लिए onPause () में, आप कॉल कर सकते हैं:

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

4
आप सही थे, @ बोलिंग! जब कुछ और काम नहीं किया, तो आपके कोड ने मुझे बचा लिया। धन्यवाद!
विलिएन पैक्साओ

3
आपका कोड केवल वही था जो मेरे लिए काम करता था, और मैंने इस पृष्ठ पर हर समाधान की कोशिश की! आपका बहुत बहुत धन्यवाद!
मटिया रग्गिएरो

4
इसे मजबूर मत करो। कुछ मामलों में जब आप फोरग्राउंड से बैकग्राउंड में जाते हैं तो कीबोर्ड वहां मौजूद रहेगा क्योंकि आपने उसे मजबूर किया था। इसका विखंडन मुद्दा है, लेकिन मैंने इसे सैमसंग डुओ पर देखा है।
j2emanue

मेरे पास आमतौर पर कीबोर्ड ऑनपॉज़ () बंद करने के लिए कोड होता है क्योंकि मैंने देखा है कि अगर आप इसे बल नहीं देते तो भी यह अटक जाता है।
बोलिंग

यह काम किया है, लेकिन जब अन्य स्क्रीन पर ले जाते हैं, यह अभी भी खुला रहता है
Sithu

75

निम्न कोड खोज के लिए Google के 4.1 स्रोत कोड से सुरक्षित है। काम करने लगता है, Android के कम संस्करणों पर भी ठीक है।

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

फिर इसके अलावा, नियंत्रण / गतिविधि बनाए जाने के लिए निम्न कोड को जोड़ना होगा। (मेरे मामले में यह एक गतिविधि के बजाय एक समग्र नियंत्रण है)।

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});

धन्यवाद! यह आश्चर्यजनक रूप से अच्छी तरह से काम करता है। और यह वह समाधान है जो मैं इस मुद्दे पर पढ़ रहे सभी उत्तरों और विषयों से अधिक सहज हूं।
रुई

37
: -डॉ setImeVisibility(hasFocus)?
मथायस

जब से मैं वास्तव में "अपने स्वयं के खोज दृश्य को रोल कर रहा था" मैंने इस विधि की कोशिश की (ऐसा नहीं करना चाहता था लेकिन कारण थे)। इसने गतिविधि के शुभारंभ के अलावा मेरे लिए काम किया। मैंने एंड्रॉइड जोड़ा: windowSoftInputMode = "alwaysV अदृश्य" गतिविधि के लिए और पहले से ही अनुरोध फ़ोकस () को संपादित पाठ पर बुलाया जा रहा था। चंवर की तरह काम करता है।
javahead76

किसी भी विचार को हटाने की आवश्यकता हैकैलबैक (mShowImeRunnable)? मैंने सोचा कि एक बार जब रनवे को कतार से चलाने के लिए चुना जाता है, तो उसे उसी समय कतार से हटा दिया जाएगा?
चोक यान चेंग

1
कई बदलावों की कोशिश करने के बाद, यह एकमात्र ऐसा था जिसने मेरे लिए लगातार काम किया (Android 4.42)। Thx
जॉन जे स्मिथ

34

android:windowSoftInputMode="stateAlwaysVisible" -> मैनिफ़ेस्ट फ़ाइल में।

edittext.requestFocus(); -> कोड में।

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


2
यह गतिविधि निर्माण पर कीबोर्ड को खोलता है।
xpto

इस सवाल का जवाब नहीं देता है, लेकिन मेरी मदद की :)
S.Thiongane

एपीआई 22 में requestfocus बिना चाबी को खोलता है
डेविड

मेरे केस के लिए ठीक काम करता है। मुझे आश्चर्य है कि क्यों अनुरोध xml से फोकस विशेषता के manifestरूप में अच्छी तरह से एक उल्लेख की जरूरत है !
सूद

30

नीचे दिए गए कोड के साथ कुछ सरल मामलों में मुझे हाल ही में कुछ किस्मत मिली है। मैंने सभी परीक्षण समाप्त नहीं किए हैं लेकिन ...।

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

और कीबोर्ड को दिखाता है।


मेरे मामले के लिए मेरे पास कुछ वैकल्पिक जानकारी जोड़ने के लिए एक बटन था। बटन में। क्लिक करें हैंडलर को वैकल्पिक जानकारी के इनपुट के लिए सॉफ्ट कीबोर्ड को मजबूर करने के लिए उपरोक्त कोड जोड़ा गया था। Droid 2.2.2
Dent

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

आपको इसके तर्क के रूप में ACTION_UP के साथ बस एक प्रेषण की आवश्यकता है (..)
मोहम्मद जुनैद

15

आप सॉफ्ट कीबोर्ड को दिखाने के लिए मजबूर करने की कोशिश कर सकते हैं, यह मेरे लिए काम करता है:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

1
मेरे लिए यह काम करता है ... मैंने इन InputMethodManager की कोशिश की थी imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (नाम, inputMethodManager.SHOW_IMPLICIT); या getWindow ()। setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); लेकिन उनमें से कोई भी काम नहीं कर रहा था।
गुने गुल्लेकिन २४'१६

10

कभी-कभी raukodraug का जवाब काम नहीं करेगा। मैंने इसे कुछ परीक्षणों और त्रुटियों के साथ इस तरह बनाया है:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

और EditText हिस्सा:

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });

1
यह एकमात्र समाधान है जिसने मेरे लिए एंड्रॉइड 5 पर काम किया है
user1021430

10

कीबोर्ड को छिपाने के लिए, इसका उपयोग करें:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

और कीबोर्ड दिखाने के लिए:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

DialogFragment के लिए, आप इसे ओवरराइड में कॉल कर सकते हैं onStart(), और आप इसके getDialog().getWindow()विकल्प के रूप में उपयोग कर सकते हैं getActivity().getWindow()
श्री-आईडीई

10

और कोटलिन के लिए बस इस एक्सटेंशन का उपयोग करें:

fun EditText.showKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

मुझे इसकी ही खोज थी।
लेज़ेक्यू ०२०११

8

टुकड़े के लिए, सुनिश्चित करें कि इसका काम:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

7

showSoftInput मेरे लिए बिल्कुल भी काम नहीं कर रहा था।

मुझे लगा कि मुझे इनपुट मोड सेट करने की आवश्यकता है: (यहां गतिविधि घटक में प्रकट में)

android:windowSoftInputMode="stateVisible" 

6

शीतल कीबोर्ड के साथ मेरी समस्या पर विश्वास करें या न करें, जब मुझे पता चला कि क्रियाएँ एनिमेशन सॉफ्ट कीबोर्ड को अक्षम कर सकते हैं। जब आप इरादे से बुलाते हैं

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

तथा

overridePendingTransition(0, 0);

यह सॉफ्ट कीबोर्ड को छिपा सकता है और इसे दिखाने का कोई तरीका नहीं है।


6

मुझे विभिन्न विभिन्न स्थितियों में एक ही समस्या थी, और जिन समाधानों में मुझे काम मिला है, उनमें से कुछ में काम नहीं किया गया है, इसलिए यहां एक संयोजन समाधान है जो कि ज्यादातर स्थितियों में काम करता है जो मैंने पाया है:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}

6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});

6

मैंने यहां सब कुछ संयोजित किया और मेरे लिए यह काम करता है:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

6

इसने मेरे लिए काम किया। आप कीबोर्ड दिखाने के लिए इसके साथ भी कोशिश कर सकते हैं:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

5

सांकेतिक टुकड़ा । । ।

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}

5

Kotlin फोकस पर कीबोर्ड दिखाने के लिए विस्तार।

यह पिछली प्रतिक्रियाओं का एक संयोजन है, जहां या तो बहुत लंबा या अधूरा है।

यह एक्सटेंशन संदेश कतार पर एक रनवेबल पोस्ट करता है जो फ़ोकस अनुरोध करने के बाद सॉफ्ट कीबोर्ड दिखाता है:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

जरूरत पड़ने पर इसे किसी भी दृश्य से कॉल करें:

editText.showSoftKeyboard()


4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

4

अपनी उपस्थिति के अंदर:

android:windowSoftInputMode="stateAlwaysVisible"- शुरू में कीबोर्ड लॉन्च किया गया। android:windowSoftInputMode="stateAlwaysHidden" - शुरू में छिपा हुआ कीबोर्ड।

मुझे इसका उपयोग करना पसंद है "adjustPan"क्योंकि जब कीबोर्ड लॉन्च होता है तो स्क्रीन ऑटो समायोजित हो जाता है।

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

4

इस लाइन को अपने EditText दृश्य में जोड़ें:

android:isScrollContainer="true"

और टाडा - कीबोर्ड अपने आप दिखाई देने लगा!

मुझे इसी तरह की समस्या थी और इस सरल और अजीब समाधान की खोज की।

जैसा कि user3392439 द्वारा पहले ही यहां बताया जा चुका है, कीबोर्ड पर उपस्थिति किसी भी तरह ध्यान से XML फ़ाइल में स्क्रॉल घटक के संरक्षण के साथ जुड़ा हुआ है।

यहां तक ​​कि एक अन्य एडिटटेक्स्ट दृश्य की उपस्थिति जिसमें एक ही एक्सएमएल में उक्त पंक्ति शामिल है, जिससे कीबोर्ड को कोई फर्क नहीं पड़ता है कि एडिटटेक्स में से एक वर्तमान में केंद्रित है।

यदि आपके पास कम से कम एक दिखाई देता है दृश्य है जिसमें आपकी XML फ़ाइल में स्क्रॉल घटक शामिल है - कीबोर्ड स्वचालित रूप से फ़ोकस पर दिखाई देगा।

यदि कोई स्क्रॉल नहीं है - तो आपको कीबोर्ड दिखने के लिए EditText पर क्लिक करना होगा।


यह बहुत अजीब है, लेकिन यह निश्चित रूप से काम करता है - मैं requesFocus()एक क्लिक हैंडलर के भीतर से प्रयास कर रहा था और यह एक स्पष्ट प्रदर्शन के अलावा अन्य एकमात्र तरीका है। Shput_FORCED
आकर्षित

पवित्र श * टी, धन्यवाद आदमी। कोई सुराग नहीं कि यह क्यों काम करता है, लेकिन मैंने इसे अलग-अलग निर्माताओं के 8 उपकरणों पर परीक्षण किया है और यह हर काम किया है!
एंटोनियो वाल्सिक

3

ऊपर दिए गए सभी समाधान ( InputMethodManager सहभागिता OnFocusChangeListener.onFocusChange श्रोता से आपके EditText में संलग्न है, यदि आप गतिविधि में एकल संपादन करते हैं तो ठीक है।

मेरे मामले में मेरे दो संपादन हैं।

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

मैंने देखा है कि onFocusChange के साथ TVX के लिए ट्रिगर किया गया है hasFocus = true (कीबोर्ड दिखाया गया है) लेकिन फिर hasFocus = true (कीबोर्ड छिपा हुआ) के साथ tvY के लिए। अंत में, कोई कीबोर्ड दिखाई नहीं दे रहा था।

सामान्य समाधान में सही कथन होना चाहिए यदि "कीबोर्ड दिखाएं तो EditText पाठ में फोकस है"


3

गतिविधि के आपके onResume () अनुभाग में आप कर सकते हैं विधि callKeyboard ();

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }

क्या है WidgetUtils.showKeyboard? यहाँ सबसे महत्वपूर्ण बिट है।
ट्वीस्टेरोब

2

मेरे लिए किसी भी उत्तर ने काम नहीं किया। यहाँ एक सरल तरीका है।

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

बस 400 फीट के लिए रिक्वेस्ट फ़ोकस () विधि में देरी हुई।


बहुत धन्यवाद, यह कीबोर्ड दिखाने के लिए कुछ देरी की जरूरत है ...
hkh114

1

मुझे एक अजीब व्यवहार का पता चला, क्योंकि मेरे एक ऐप में, सॉफ्ट कीबोर्ड स्वचालित रूप से गतिविधि में प्रवेश करने पर दिखा रहा था (ऑनक्रिएट में एक editText.requestFocus () है)।

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

यदि यह आपके लिए काम नहीं करता है, तो स्क्रॉल-व्यू में डालने का प्रयास करें - यह वैसे भी हानिरहित है।


1

मुझे दृश्य एनिमेशन का उपयोग करने में इसी तरह की समस्या थी । इसलिए मैंने यह सुनिश्चित करने के लिए एक एनीमेशन श्रोता रखा है कि मैं दिखाए गए एडिटेक्स पर कीबोर्ड एक्सेस का अनुरोध करने से पहले एनीमेशन के समाप्त होने का इंतजार करूँगा।

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });

1

मैं इस बात से सहमत हूँ कि आप इस तरह से एक निवेदन का उपयोग कर सकते हैं / इस तरह से स्पष्ट ध्यान केंद्रित करें:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

सादर।

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