मैं अपने EditText प्रोग्राम पर फ़ोकस कैसे सेट कर सकता हूं (और कीबोर्ड प्रदर्शित करता हूं)


179

मेरे पास एक लेआउट है जिसमें कुछ इस तरह के दृश्य हैं:

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

मैं अपने EditTextप्रोग्राम पर फोकस (कीबोर्ड को प्रदर्शित) कैसे सेट कर सकता हूं ?

मैंने यह कोशिश की है और यह केवल तभी काम करता है जब मैं अपना Activityसामान्य रूप से लॉन्च करता हूं , लेकिन जब मैं इसे लॉन्च करता हूं TabHost, तो यह काम नहीं करता है।

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


जवाबों:


352

इसे इस्तेमाल करे:

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

http://developer.android.com/reference/android/view/View.html#requestFocus ()


इस उत्तर से दिखाने के लिए कीबोर्ड को मजबूर करने के लिए कोड के साथ अपडेट किया गया: stackoverflow.com/questions/5105354/…
डेविड मेरिमैन

5
यह केवल तभी काम करता है जब मैं अपनी गतिविधि को सामान्य रूप से लॉन्च करता हूं, लेकिन जब मैं अपनी गतिविधि को TabHost पर लॉन्च करता हूं, तो यह काम नहीं करता है,
Houcine

27
यह काम नहीं करता है। यह मेरे लिए एक काम करता है InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
गुने गुल्लेकिन

5
"यह काम नहीं करता है भाई"। कुछ मामलों में आपको postDelayed () से इस कोड को अतुल्यकालिक रूप से कॉल करने की आवश्यकता है। मेरे पास एक मामला था जब मुझे संवाद पर "ओके" दबाए जाने के बाद कीबोर्ड खोलना पड़ा। और जब संवाद बंद हो रहा था तो वह ध्यान के साथ खिलवाड़ कर रहा था। इसलिए मैंने postDelayed () से ऊपर का कोड कहा है। डायलॉग बंद होने के बाद इसे अंजाम दिया गया। फायदा।
डेनियल वोल्ख

2
जवाब पर 237 वोट और 62 पर "यह काम नहीं करता है भाई" it मैंने खुद की राय पाने के लिए इसका परीक्षण किया और यह सही काम करता है!)
डैनियल

165

उपयोग:

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

20
5 से अधिक अन्य तरीकों की कोशिश करने के बाद, यह एकमात्र ऐसा था जिसने मेरे लिए काम किया (एक Viewउपवर्ग से)
विलियम

13
यह सुझाव कीबोर्ड को तय करता है, तब भी जब क्षेत्र फोकस को खो देता है।
तक

2
हाँ, यह मेरे लिए भी imm.showSoftInput()काम करता है , और काम नहीं करता है।
स्पार्क.बाओ

8
जब यह विधि काम करती है, तो इसमें नीचे की तरफ होता है, होम बटन (हार्डवेयर) के साथ एप्लिकेशन को छोड़ने से कीबोर्ड स्क्रीन पर आ जाएगा। आपको अपने होम स्क्रीन पर बेकार होने वाले कीबोर्ड को छिपाने के लिए रिटर्न बटन (हार्डवेयर) को प्रेस करना होगा।
एड्रिन होर्निज़

अन्य दृष्टिकोणों ने मेरे लिए काम नहीं किया, यह एक ने किया। धन्यवाद।
इमान अकबरी

53

इसने मेरे लिए काम किया, धन्यवाद अनजाने में

कीबोर्ड दिखाएं:

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

कीबोर्ड छुपाएं:

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

2
एकमात्र पूर्ण समाधान। धन्यवाद।
कोर्रो

41

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

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

उममीद है कि इससे मदद मिलेगी!


5
जब गतिविधि शुरू की गई थी, तब यह कीबोर्ड दिखा।
विलियम

1
विस्मयकारी :) जवाब का एक गुच्छा की कोशिश की, लेकिन केवल इस के साथ, मैं यह काम कर सकता है :) बहुत बहुत धन्यवाद।
श्रीकांत

बहुत ही कम जवाब
अविनाश आर

एकदम सही जवाब। केवल "editText.requestFocus ()" के साथ काम करता है। धन्यवाद।
AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
मुझे ऐसा करने के लिए ऐसा करना पड़ा ताकि इसे ऑनस्क्यूम () में दिखाया जा सके। देरी के बिना, इस धागे में वर्णित हर एक समाधान का उपयोग करने से कुछ नहीं होगा।
FranticRock

1
वो रहा। यही वह उत्तर था जिसकी मुझे तलाश थी। हालाँकि, आपको पूरी तरह से दूसरी देरी की आवश्यकता नहीं है। मैंने सिर्फ 150 मिली की कोशिश की, और यह ठीक भी काम किया।
रबरडक

1
धन्यवाद! यह 0 एमएस ( tb.post({ showKeyboard(tb) })) के लिए भी काम करता है । ध्यान दें कि हमें एक EditText दृश्य की आवश्यकता है ( tb), खंडित दृश्य नहीं।
कूलमाइंड जूल

16

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

fun View.showKeyboard() {
  this.requestFocus()
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

तो आप बस यह कर सकते हैं:

editText.showKeyboard()
// OR
editText.hideKeyboard()

आराम की तुलना में यह एक बेहतर उपाय है
d-feverx

5

मैं एक LifecycleObserver का उपयोग करने की सलाह देता हूं जो कि Android Jetpack के Lifecycle-Aware Components के साथ हैंडलिंग जीवनचक्र का हिस्सा है ।

मैं फ्रेगमेंट / गतिविधि दिखाई देने पर कीबोर्ड को खोलना और बंद करना चाहता हूं। सबसे पहले, EditText के लिए दो एक्सटेंशन फ़ंक्शंस परिभाषित करें । आप उन्हें अपनी परियोजना में कहीं भी रख सकते हैं:

fun EditText.showKeyboard() {
    requestFocus()
    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)
}

फिर एक LifecycleObserver को परिभाषित करें जो गतिविधि / टुकड़ा पहुंचने onResume()या onPause: तक कीबोर्ड को खोलता और बंद करता है

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

फिर अपने किसी भी फ्रेग्मेंट्स / एक्टिविटीज में निम्न लाइन जोड़ें, आप किसी भी समय LifecycleObserver का पुन: उपयोग कर सकते हैं। उदाहरण के लिए:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

3

यहाँ कीबोर्ड को छिपाने और दिखाने के लिए KeyboardHelper Class है

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(Context context, View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }, 1000);
}

public static void hideSoftKeyboard(Context context, EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
        }
    }, 1000);
}


public static void openSoftKeyboard(Context context, EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
        }
    }, 1000);
}

}


0

पहला तरीका :

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

दूसरा तरीका :

मेनिफेस्ट में:

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

कोड में:

etPassword.requestFocus();

0

मैंने बहुत सारे तरीके आज़माए और यह काम नहीं कर रहा है, यह सुनिश्चित नहीं है क्योंकि मैं खंडित से साझा पाठ से संबंधित गतिविधि तक साझा संक्रमण का उपयोग कर रहा हूं।

Btw मेरे एडिटेक्स को LinearLayout में भी लपेटा गया है।

मैंने फ़ोकस अनुरोध करने के लिए थोड़ी देरी की और नीचे दिए गए कोड ने मेरे लिए काम किया: (कोटलिन)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

showKeyboard ()

 val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

मुझे इनमें से कोई भी जवाब अपने दम पर काम करने के लिए नहीं मिला। मेरे लिए समाधान उन्हें संयोजित करना था:

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

मुझे यकीन नहीं है कि मेरे लिए यह क्यों आवश्यक था - डॉक्स के अनुसार ऐसा लगता है कि या तो विधि को अपने दम पर काम करना चाहिए था।


यह निश्चित रूप से एक अच्छा अभ्यास नहीं है। शायद, गतिविधि या फ्रैगमेंट लेनदेन नरम कीबोर्ड के साथ हस्तक्षेप कर रहा था या इनपुट विधि झंडे सही तरीके से सेट नहीं किए गए थे लेकिन किसी भी तरह से, इस समाधान का उपयोग नहीं किया जाना चाहिए।
मार्सेल ब्रो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.