प्रोग्रामेटिक रूप से सॉफ्ट कीबोर्ड खोलें


116

मेरे पास इसके लिए कोई चाइल्ड विजेट नहीं है और संबंधित xml फ़ाइल है,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
>
</LinearLayout>

और मैं सॉफ्ट कीबोर्ड को प्रोग्रामिक रूप से खोलना चाहता हूं जबकि गतिविधि शुरू हो जाती है। और मैंने अब तक जो भी कोशिश की है वह है,

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

मुझे कुछ मार्गदर्शन दें।


हाय विग्नेश लेकिन बिना किसी टेक्स्ट व्यू के सॉफ्ट कीबोर्ड खोलने की क्या जरूरत है?
मिलिंद

वास्तव में मैं उस गतिविधि में मुख्य श्रोता का उपयोग करने की कोशिश कर रहा हूं, इसके लिए मुझे ऐसा करने की आवश्यकता है।
विग्नेश

आपने जो किया है वह सही है। मुझे यकीन नहीं है कि आप कीबोर्ड क्यों नहीं देख रहे हैं। मैंने इस कोड का उपयोग एक बार एक एडिटटेक्स्ट पर किसी भी उपयोगकर्ता कार्रवाई के बिना कीबोर्ड लॉन्च करने के लिए किया और यह सफल रहा।
विनोथ

हाय विनोथ, मैंने अपना कोड बिल्कुल DSouza पोस्टों के रूप में बदल दिया है और मैंने अपने प्रश्न में भी अपडेट किया है, इसलिए जाँच करें कि मुझे क्या बदलना है।
विग्नेश

जवाबों:


145

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

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

लेकिन मैं अभी भी इसे खोलने में सक्षम नहीं हूं, जबकि गतिविधि खुली हुई है, तो क्या इसके लिए कोई समाधान है?


@YosiTaguri, यदि आप गतिविधियों के साथ काम कर रहे हैं तो बहुत अधिक सुरुचिपूर्ण। और टुकड़ों के बारे में क्या! दोनों जवाबों के लिए +1
S.Thiongane

और अगर आपको टेक्स्ट एडिट करने वाले डायलॉग पर कीबोर्ड खोलना है तो क्या होगा? उसको कैसे करे?
सीमा

5
@ विग्नेश: अगर आप गतिविधि शुरू करने के समय इस कोड को लागू करना चाहते हैं, तो कीबोर्ड खोलते समय आपको कुछ देरी की जरूरत होगी जैसे 500 मिलीसेकंड।
विनित सक्सेना

@vinitsaxena आपकी बहुमूल्य टिप्पणी के लिए धन्यवाद
विग्नेश

मुझे यकीन नहीं है, लेकिन मुझे उदाहरण के लिए TextView और इस तरह myTextView.post (नए Runnable () {public void run () {// यहाँ अपने तरीके}}) जैसे श्रोता को देखने का प्रयास किया गया; और जब यह दृश्य बनेगा तो इसका मतलब है कि अब दिखाई देने वाली सभी स्क्रीन पर आप जो चाहें कॉल कर सकते हैं
अलेक्सी टिमोशेंको

121

अपनी मैनिफ़ेस्ट फ़ाइल में, निम्न को जोड़ने का प्रयास करें <activity> गतिविधि शुरू होने पर कीबोर्ड को दिखाने के :

android:windowSoftInputMode="stateVisible"

यह गतिविधि शुरू होने पर कीबोर्ड को दिखाई देने का कारण बनना चाहिए।

अधिक विकल्पों के लिए, दस्तावेज़ीकरण की जाँच करें


3
काश मैं इस उत्तर के लिए और अधिक बार केवल पृष्ठ के निचले भाग में उन सभी गंदे हैक्स पाने के लिए
उत्थान कर सकता

आप इस कार्यक्रम को कैसे करते हैं? मैं केवल कुंजीपटल को कुछ स्थितियों में स्वचालित रूप से दिखाना चाहता हूं।
फ्राकेहेड

1
मैं इस लिंक की तरह इनपुट संवाद लिंक गतिविधि पर नहीं बल्कि शीघ्र पर कुंजीपटल को दिखाने के लिए कैसे? इसने काम किया धन्यवाद <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef

7
वह कहता है "प्रोग्रामेटिकली"।
मर्ट अक्काया

2
यह मेरे लिए काम नहीं करता है। इसके बजाय, यह करता है: android: windowSoftInputMode = "stateAlwaysV अदृश्य"
रेंडिकैह

34

कृपया नीचे दिए गए कोड का पालन करें। मुझे यकीन है कि आपकी समस्या हल हो जाएगी।

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 

नमस्ते, मैंने अभी-अभी आपके कार्य को onCreate फ़ंक्शन के अंदर पेस्ट किया है, लेकिन फिर भी मेरी गतिविधि में कोई बदलाव नहीं हुआ है, यदि आप चाहते हैं कि मैं कोड पेस्ट करूं, तो मैं टिप्पणी में पेस्ट करूंगा।
विग्नेश

जब आप सॉफ्टबोर्ड को एक्सेस करना चाहते हैं तो कृपया मुझे बताएं ताकि मैं आपकी समस्या का समाधान कर सकूं। कृपया मुझे कोड भेजें .... यदि संभव हो
AndroidDanger

मैं अपनी गतिविधि के लिए onKeyboardActionListener सेट करना चाहता हूं जिसमें रैखिक लेआउट के अलावा कुछ भी नहीं है।
विग्नेश

बस ऊपर मेरा प्रश्न देखें, जिसमें आपने मेरे लिए जो प्रदान किया है, उसके साथ मैंने कोड को संपादित किया है।
विग्नेश

यह गतिविधि केवल कीबोर्ड एक्शन के लिए है, मैं प्रत्येक कुंजी को दबाया हुआ सुनना चाहता हूं (onKeyboardActionListener का उपयोग करके) और मैं इसे एक साथ स्थानीय सर्वर पर भेजूंगा
विग्नेश

25

यह काम है

<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

या

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

2
यह सेट करने के प्रोग्रामेटिक तरीके के लिए धन्यवाद - यह काम करता है, जबकि InputMethodManager हैक नहीं करता है।
मार्टिन विसेनी

17

मुझे बहुत ही सटीक क्षण में कीबोर्ड को उजागर करना था। यह मेरे लिए काम किया! धन्यवाद Benites।

    private Handler mHandler= new Handler();

और बहुत सटीक क्षण में:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 

इस समाधान ने मेरे लिए काम किया अंदर पर () पोस्ट कार्रवाई में देरी पर थोड़ा संशोधन के साथ: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper

1
मैं इसे एक ViewTreeObserver कॉलबैक में डालने की सलाह दूंगा ताकि समय की मनमानी राशि के लिए प्रतीक्षा करने से बचने के लिए इसे पहले लेआउट पर बुलाया जाए। यह सुरक्षित / अधिक उत्तरदायी होना चाहिए।
गेब्रियल

केवल इस समाधान ने मेरे लिए काम किया। मेरे पास पहले के तरीके थे, जिनमें काम किया लेकिन दुर्भाग्य से नवीनतम ओएस के लिए, हैंडलर काम करने योग्य समाधान है।
एमडी। शफीउल आलम बिप्लब

12

मैंने ऑनक्लिक ईवेंट के अंदर सॉफ्ट कीबोर्ड को प्रदर्शित करने के लिए निम्न पंक्तियों का उपयोग किया है।

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }

9

उस पर रखें Resume विधि:

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

रन करने योग्य की आवश्यकता होती है क्योंकि जब ओएस onResume विधि से आग लगाता है तो आप यह सुनिश्चित नहीं कर सकते कि सभी दृश्य जहां आकर्षित करते हैं, इसलिए आपके रूट लेआउट से पोस्ट की गई विधि इसे तब तक इंतजार करती है जब तक कि प्रत्येक दृश्य तैयार न हो जाए।


1
मैं एक संवाद में एक SearchViewFragment था और पहली बार डायलॉग आया SearchView में फ़ोकस था ... लेकिन कीबोर्ड तब तक नहीं था जब तक कि उपयोगकर्ता इसे नहीं छूता। हम शो शो के लिए कोशिश कर रहे थे OnSumeInput और भी toggleSoftInputFromWindow OnResume ALONE से ... या यहां तक ​​कि खोज के लिए OnFocusChangeListener में ... लेकिन उनमें से कोई भी काम नहीं किया क्योंकि खिड़की उठने से पहले आग लगती थी और खींची जाती थी ..... OnResume में इस पोस्ट ईवेंट का उपयोग करके इसे अंततः हल कर दिया गया।
20

8

ऐसा लगता है कि यह काम कर रहा है

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

लगता है कि यह बेहतर काम करता है: प्रकट में:

<application>
    <activity
        android:name="com.doodkin.myapp.ReportActivity"
        android:label="@string/title_activity_report"
        android:screenOrientation="sensor" 
        android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

एंड्रॉइड 4.2.2 में काम करते हुए प्रकट होता है, लेकिन एंड्रॉइड 4.0.3 में काम नहीं करता है


8

में onCreate गतिविधि की विधि या onActivityCreated एक टुकड़ा की

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });

6

मैंने प्रोग्राम को सॉफ्ट कीबोर्ड दिखाने के लिए इस तरह का उपयोग किया है और कीबोर्ड लॉन्च करते समय स्क्रीन के ऑटो आकार को रोकने के लिए यह मेरे लिए काम किया है।

प्रकट में:

<activity android:name="XXXActivity" android:windowSoftInputMode="adjustPan">
</activity>

XXXActvity में:

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

मुझे लगता है कि यह इस समस्या की खोज के लिए दूसरों का समय बचाएगा।


काम करता है, लेकिन यदि आप ऐप से बाहर निकलते हैं, तो भी कीबोर्ड दिखाई देता है, और एक बार कीबोर्ड बंद करने के बाद यदि आप ऐप को फिर से खोलते हैं, तो कीबोर्ड दिखाई नहीं देता है
nulll

मुझे अब तक इस समस्या का सामना नहीं करना पड़ा। मुझे लगता है कि यह डिवाइस की समस्या है।
नंदला संदीप

टाइमर की आवश्यकता क्यों है? क्या आप गहराई में जाने के लिए लिंक जोड़ सकते हैं?
nulll

6

Kotlin

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

जावा

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}

3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

3

मैंने इसे सिंगलटन की तरह इस्तेमाल किया:

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

इसे अपनी गतिविधि में उपयोग करें जैसे:

showSoftKeyboard(this, yourEditTextToFocus);

फ़ंक्शन और साथ ही फ़ंक्शन का उपयोग करने के तरीके पर एक छोटी स्निपेट शामिल करने के लिए बहुत-बहुत धन्यवाद। यह ठीक वैसे ही काम करता है जैसा मुझे इसकी आवश्यकता थी!
चाड विल्सन

3

यह काम:

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

और आप इस विधि को इस तरह कहते हैं:

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCED अच्छा विकल्प नहीं है। यदि आप इस सेटिंग का उपयोग करते हैं तो आपको छिपने की कीबोर्ड स्थिति का प्रबंधन करना चाहिए। मेरा सुझाव इस तरह है;

    public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}

इसके अलावा, आप मापदंडों को ध्यान में रखते हुए (आमतौर पर EditText) पर ध्यान केंद्रित कर सकते हैं। यह इसे और अधिक उपयोगी कार्य करता है

InputMethodManager.SHOW_IMPLICIT और SHOW_FORCED के बारे में अधिक जानकारी के लिए; InputMethodManager


1

यह आवश्यक स्रोत कोड है:

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

जानकारी के लिए कृपया इस लिंक पर जाएं। इससे मुझे मदद मिली। https://github.com/Nikhillosalka/Keyboard/blob/master/README.md


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

सॉफ्ट कीबोर्ड खोलने के लिए onResume () में उपरोक्त कोड का उपयोग करें


1

@ShimonDoodkin के उत्तर के समान ही मैंने एक टुकड़े में किया था।

https://stackoverflow.com/a/29229865/2413303

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

कहाँ ShowKeyboardहै

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

एक सफल इनपुट के बाद, मैं यह भी सुनिश्चित करता हूं कि मैं कीबोर्ड छिपाऊं

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

1
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

public static void hideKeyboard(final Activity activity) {
    final View view = activity.getCurrentFocus();
    if (view != null) {
        final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}

0

पहले से ही बहुत सारे उत्तर हैं, लेकिन इसके अलावा मेरे लिए कुछ भी काम नहीं किया

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

मैंने showSoftInputसाथ उपयोग कियाSHOW_FORCED

और मेरी गतिविधि है

 android:windowSoftInputMode="stateVisible|adjustResize"

आशा है कि यह किसी की मदद करता है


0

अपनी आधार गतिविधि में इस विधि को पोस्ट करें और इसे अन्य गतिविधियों जैसे आकर्षण का उपयोग करें

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.