কোনও খণ্ডের ভিতরে থেকে কীভাবে নরম কীবোর্ডটি লুকানো যায়?


84

আমি একটি আছে 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করে খণ্ডের মধ্যে থেকে কল করব?

উত্তর:


181

আপনার খণ্ডটি যতক্ষণ না কোনও ভিউ তৈরি করে ততক্ষণ আপনি সেই ভিউটি সংযুক্ত হওয়ার পরে সেই ভিউ থেকে আইবাইন্ডার (উইন্ডো টোকেন) ব্যবহার করতে পারেন । উদাহরণস্বরূপ, আপনি আপনার খণ্ডগুলিতে ক্রিয়াকলাপের উপরের কাজটি ওভাররাইড করতে পারেন:

@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
আমি এটি আমার প্রোজেক্টে যুক্ত করেছি ut তবে যখন আমি অন্য ট্যাবটিতে ক্লিক করি তখন এটি ক্র্যাশ হয়ে যায়।
andro-girl

4
যারা নালপয়েন্টার এক্সসেপশন দিয়ে এটি করছেন এবং ক্র্যাশ করছেন, তাদের জন্য কেবলমাত্র ক্রেইটভিউ পদ্ধতির ইনপুটমেথডম্যানেজারটি ব্যবহার করুন। এটি করার ফলে, আপনার দৃষ্টিভঙ্গি থাকবে এবং আপনি im.hideSoftInputFromWindow (দেখুন.getWindowToken (), 0) এ স্ফীতকৃত ভিউটি ব্যবহার করে শেষ লাইনটি পরিবর্তন করতে পারেন;
আরাশিফের

84

নিম্নলিখিত কোডের লাইনটি ছাড়া আমার পক্ষে কিছুই কার্যকর হয়নি:

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

4
SOFT_INPUT_STATE_HIDDENআমার জন্যও কাজ করেছিল, যদিও আমি জানি না যে that SOFT_INPUT_STATE_ALWAYS_HIDDEN 'এর মধ্যে পার্থক্য কী।
এইচব্রেন্ট

4
প্রথম উত্তরটি কার্যকর হয়নি, এইটি কৌশলটি করেছে। ধন্যবাদ
মৌজিব 21

4
আমার বন্ধুকে বাঁচানোর জন্য ধন্যবাদ
হরিশ রেড্ডি

আমার পরিস্থিতি হ'ল আমি খণ্ড / ট্যাবভিউ ব্যবহার করছি। প্রথম ট্যাবে একটি পাঠ্য ভিউতে "টিপস" রয়েছে। দ্বিতীয় ট্যাবে একটি ক্রিয়াকলাপ আছে যেখানে আমার "editText1.setShowSoftInputOnFocus (মিথ্যা)" সহ সম্পাদনা পাঠ্য রয়েছে; " কমান্ড সেট এবং আমার নিজস্ব কাস্টম কিপ্যাড। আমি যখন অ্যাপটিকে ব্যাকগ্রাউন্ডে রাখি এবং তারপরে অ্যাপটি আনব তখন অযাচিত সফ্ট কীবোর্ডটি পপ-আপ হবে। অন ​​স্টার্ট লাইফ সাইকেল ওভাররাইড পদ্ধতিতে উপরের কমান্ডটি সেট করা এটিকে থামায়। ধন্যবাদ @ শাজিল আফজাল
একটি সিএস স্টুডেন্ট চিরকালের জন্য

21

যদি আপনি আপনার ক্রিয়াকলাপের ম্যানিফেস্ট সংজ্ঞায় নিম্নলিখিত বৈশিষ্ট্য যুক্ত করেন তবে আপনার ক্রিয়াকলাপটি খোলার পরে পপিং থেকে এটি কীবোর্ডকে পুরোপুরি দমন করবে। আশা করি এটি সহায়তা করে:

(আপনার ক্রিয়াকলাপের প্রকাশিত সংজ্ঞাতে যুক্ত করুন):

android:windowSoftInputMode="stateHidden"

ধন্যবাদ, আমি এটাই শেষ করেছি। তবে আমি কীবোর্ডটি দেখানোর / আড়াল করার জন্য কীভাবে ইনপুট পদ্ধতি ম্যানেজারটি ব্যবহার করব তা জানতে চাই, কারণ ক্রিয়াকলাপটি শুরুর পরে আমার এটি ব্যবহার করার প্রয়োজন হতে পারে।
উইলহল

13
    @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

অনক্রেট হ'ল ফ্রেগমেন্টের বাইরের একটি শ্রেণি, তাই আমি এই শ্রেণিতে ফোনকিপ্যাড অপসারণ করতে এটি ব্যবহার করতে সক্ষম হতে রুট ভিউটি পাস করি। আমি মনে করি তারা ফ্রেগমেন্টের ভিতরে থেকে এটি চেয়েছিল ফ্রেগমেন্টের কোনও শ্রেণি নয়।
মোবাইল অ্যাপ্লিকেশনগুলি

11

DialogFragmentযদিও ব্যতিক্রম , এম্বেডের ফোকাস Dialogঅবশ্যই আড়াল করা আবশ্যক, এর পরিবর্তে EditTextএম্বেডের মধ্যে কেবল প্রথমটিDialog

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

4
আপনার ডায়ালগফ্রেগমেন্ট থাকলে কীবোর্ডটি লুকানোর একমাত্র উপায় এটি is
মাতাজাজ ক্রিস্ট

এটা কোথায় লিখবেন?
এমস্ট্যাক

@ মস্তাক, ক্রিয়াকলাপ তৈরি () পদ্ধতিতে কাজ করে। 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

এপিআই 27 এ কিছুই কাজ করেনি। আমাকে এটি লেআউটটির পাত্রে যুক্ত করতে হয়েছিল, আমার জন্য এটি একটি কনস্ট্রেন্টলয়েট ছিল:

<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 এ কাজ করে না, তবে এটি (খণ্ড শ্রেণীর অভ্যন্তরে) @ ওভাররাইড পাবলিক শূন্যতালিকাটি চালু করুন ()। সুপার.অন রিসুম (); getView ()। সেটফোকসযোগ্য (সত্য); getView () .FFocableInTouchMode (সত্য); getView ()। অনুরোধফোকাস (); }
ডার্কো

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()করতে হবে নাল নয় কিনা অন্যথায় যদি কোনও কেন্দ্রীভূত সম্পাদনা পাঠ্য না থাকে তবে এটি ত্রুটি ঘটায়। নীচে আমার উত্তরটি দেখুন
ডুক ট্রুং মাই


0

আপনার কোডটিতে কেবল এই লাইনটি যুক্ত করুন:

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


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);
   }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.