एक टुकड़े के अंदर से नरम कीबोर्ड को कैसे छिपाएं?


82

कई अंशों की सेवा के लिए मेरे पास एक FragmentActivityउपयोग है ViewPager। प्रत्येक ListFragmentनिम्नलिखित लेआउट के साथ है:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="8dp">
        <ListView android:id="@id/android:list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

        <EditText android:id="@+id/entertext"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //Save the container view so we can access the window token
    viewContainer = container;
    //get the input method manager service
    imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    . . .
}

@Override
public void onStart() {
    super.onStart();

    //Hide the soft keyboard
    imm.hideSoftInputFromWindow(viewContainer.getWindowToken(), 0);
}

मैं मुख्य गतिविधि के लिए विंडो टोकन तक पहुंचने के तरीके के रूप में आने वाले ViewGroup containerपैरामीटर को बचाता हूं onCreateView। यह बिना किसी त्रुटि के चलता है, लेकिन कीबोर्ड कॉल से hideSoftInputFromWindowइन में छिपा नहीं है onStart

मूल रूप से, मैंने इसके बजाय फुले हुए लेआउट का उपयोग करने की कोशिश की container, अर्थात:

imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0);

लेकिन यह एक NullPointerExceptionमाना जाता है , शायद क्योंकि टुकड़ा ही एक गतिविधि नहीं है और एक अद्वितीय विंडो टोकन नहीं है?

क्या किसी खंड के भीतर से नरम कीबोर्ड को छिपाने का एक तरीका है, या क्या मुझे टुकड़े में एक विधि बनानी चाहिए FragmentActivityऔर इसे खंड के भीतर से कॉल करना चाहिए ?

जवाबों:


179

जब तक आपका Fragment एक View बनाता है, आप संलग्न होने के बाद उस दृश्य से IBinder (विंडो टोकन) का उपयोग कर सकते हैं । उदाहरण के लिए, आप अपने फ़्रैगमेंट में onActivityCreated को ओवरराइड कर सकते हैं:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}

9
मैंने इसे अपने प्रोजेक्ट में जोड़ा था। लेकिन जब मैं दूसरे टैब पर क्लिक करता हूं तो यह दुर्घटनाग्रस्त हो जाता है।
ओरो-गर्ल

4
जो लोग ऐसा कर रहे हैं और NullPointerException के साथ क्रैश हो रहा है, बस अपने टुकड़े OnCreateView पद्धति के अंदर InputMethodManager का उपयोग करें। ऐसा करने पर, आपके पास अपना दृश्य होगा और आप अंतिम पंक्ति को उस दृश्य का उपयोग करके बदल सकते हैं, जिसे आपने imm.hideSoftInputFromWindow (view.getWindowToken (), 0) में फुलाया है;
ऑरास्फीयर

83

कुछ भी नहीं लेकिन कोड की निम्नलिखित पंक्ति मेरे लिए काम की:

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

1
SOFT_INPUT_STATE_HIDDENमेरे लिए भी काम किया, हालांकि मुझे नहीं पता कि उसके और 'SOFT_INPUT_STATE_ALWAYS_HIDDEN' के बीच क्या अंतर है।
hBrent

2
पहला जवाब काम नहीं किया, यह एक चाल है। धन्यवाद
moujib

1
मेरे समय के दोस्त को बचाने के लिए धन्यवाद।
हरीश रेड्डी

मेरी स्थिति यह है कि मैं खंड / टैब व्यू का उपयोग कर रहा हूं। पहले टैब में TextView में "टिप्स" है। दूसरे टैब में एक गतिविधि होती है जहां मेरे पास "EditText1.setShowSoftInputOnFocus (झूठा)" के साथ EditText होता है; कमांड सेट और मेरा अपना कस्टम कीपैड। जब मैंने ऐप को बैकग्राउंड में रखा और फिर ऐप को अवांछित सॉफ्ट कीबोर्ड को पॉप-अप करने के लिए वापस लाया। ऑनस्टार्ट लाइफ साइकल ओवरराइड विधि में उपरोक्त कमांड सेट करने से यह बंद हो जाता है। धन्यवाद @ शाजील अफजल
एक सीएस छात्र को

21

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

(अपनी गतिविधि की प्रकट परिभाषा में जोड़ें):

android:windowSoftInputMode="stateHidden"

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

12
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_my, container,
                false);
        someClass.onCreate(rootView);
        return rootView;
    }

मेरी कक्षा में अपने मूल दृश्य का एक उदाहरण रखें

View view;

public void onCreate(View rootView) {
    view = rootView;

कीबोर्ड को छिपाने के लिए दृश्य का उपयोग करें

 public void removePhoneKeypad() {
    InputMethodManager inputManager = (InputMethodManager) view
            .getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);

    IBinder binder = view.getWindowToken();
    inputManager.hideSoftInputFromWindow(binder,
            InputMethodManager.HIDE_NOT_ALWAYS);
}

मैंने इसका उपयोग किया लेकिन मैंने अपने दृश्य का एक उदाहरण रखने के बजाय अपने टुकड़े से getView () का उपयोग किया।
MrEngineer13

OnCreate फ्रैगमेंट के बाहर एक वर्ग है, इसलिए मैं इसे इस श्रेणी में phoneKeyPad को हटाने के लिए उपयोग करने में सक्षम होने के लिए रूटव्यू पास करता हूं। मुझे लगता है कि वे फ्रैगमेंट के अंदर से यह चाहते थे कि फ्रैगमेंट में कोई वर्ग न हो।
मोबाइल एप्लीकेशन

10

DialogFragmentहालांकि, इसके लिए अपवाद एम्बेडेड के Dialogबजाय केवल पहले के EditTextभीतर छिपा हुआ होना चाहिएDialog

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

5
यह कीबर्ड को छिपाने का एकमात्र तरीका है, यदि आपके पास DialogFragment है।
मतेजाज़

यह कहाँ लिखा जाए?
7

@Mstack, onActivityCreated () विधि पर काम करता है। override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)}
सामी इस्सा

7

यह कोड टुकड़ों के लिए काम करता है:

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

4

इस स्थिर विधि का उपयोग करें, कहीं से भी (गतिविधि / टुकड़ा) आपको पसंद है।

public static void hideKeyboard(Activity activity) {
    try{
        InputMethodManager inputManager = (InputMethodManager) activity
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        View currentFocusedView = activity.getCurrentFocus();
        if (currentFocusedView != null) {
            inputManager.hideSoftInputFromWindow(currentFocusedView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

यदि आप केवल कॉल के लिए उपयोग करना चाहते हैं hideKeyboard(((Activity) getActivity()))


3

यह मेरे मामले में काम करेगा जब टैब में मैं एक टुकड़े से दूसरे टुकड़े में बदलूंगा

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        try {
            InputMethodManager mImm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            mImm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
            mImm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {
            Log.e(TAG, "setUserVisibleHint: ", e);
        }
    }
}

यदि आपके पास टैब टुकड़ा है और केवल कुछ टैब के लिए कीबोर्ड छिपाना चाहते हैं, तो इसका उपयोग करें।
रोनी सुलिस्टियो

1

API27 पर इसमें से कुछ भी काम नहीं किया गया। मुझे इसे लेआउट के कंटेनर में जोड़ना था, मेरे लिए यह एक कांस्टीटयूटआउट था:

<android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:focusedByDefault="true">

//Your layout

</android.support.constraint.ConstraintLayout>

यह एपीआई 26 पर काम नहीं करता है, लेकिन यह (टुकड़ा वर्ग के अंदर) @ ओवरराइड सार्वजनिक शून्य onResume () {super.onResume (); getView () setFocusable (सही)। । getView () setFocusableInTouchMode (सही); । getView () requestFocus (); }
डार्को

1

यह मेरे लिए कोटलिन वर्ग में काम करता था

fun hideKeyboard(activity: Activity) {
    try {
        val inputManager = activity
            .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        val currentFocusedView = activity.currentFocus
        if (currentFocusedView != null) {
            inputManager.hideSoftInputFromWindow(currentFocusedView.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }

}

1

किसी भी खंड बटन श्रोता में इस कोड का उपयोग करें:

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

काम करता है, लेकिन आपको जांचना होगा कि getActivity().getCurrentFocus().getWindowToken()क्या अशक्त नहीं है अन्यथा यह त्रुटि का कारण होगा यदि कोई केंद्रित एडिट टेक्स्ट नहीं है। मेरा जवाब नीचे देखें
Duc Trung Mai


0

कोटलिन में:

(activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view?.windowToken,0)

0

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

Button loginBtn = view.findViewById(R.id.loginBtn);
loginBtn.setOnClickListener(new View.OnClickListener() {
   public void onClick(View v) {
      InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE);
      imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
   }
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.