এই উন্মাদনাটি পরিষ্কার করতে সাহায্য করতে আমি গুগলের নরম কীবোর্ডের নিখরচায় হাস্যকর আচরণের জন্য সমস্ত অ্যান্ড্রয়েড ব্যবহারকারীদের পক্ষ থেকে ক্ষমা চেয়ে শুরু করতে চাই। একই সাধারণ প্রশ্নের জন্য এতগুলি উত্তর, প্রতিটি পৃথক পৃথক হওয়ার কারণ হ'ল Android এর অন্যান্য অনেকের মতো এই এপিআইও ভয়ানকভাবে ডিজাইন করা হয়েছে। আমি এটি বর্ণনা করার কোনও ভদ্র উপায় বিবেচনা করতে পারি না।
আমি কীবোর্ডটি আড়াল করতে চাই। আমি নিম্নলিখিত বিবৃতি সহ অ্যান্ড্রয়েড সরবরাহ আশা করি : Keyboard.hide()
. শেষ। আপনাকে অনেক ধন্যবাদ. তবে অ্যান্ড্রয়েডের একটি সমস্যা আছে। InputMethodManager
কীবোর্ডটি আড়াল করতে আপনাকে অবশ্যই ব্যবহার করতে হবে । ঠিক আছে, ঠিক আছে, এটি কীবোর্ডে অ্যান্ড্রয়েডের এপিআই। কিন্ত! Context
আইএমএম অ্যাক্সেস পেতে আপনার কাছে একটি আবশ্যক । এখন আমরা একটি সমস্যা আছে। আমি স্ট্যাটিক বা ইউটিলিটি ক্লাস থেকে কীবোর্ডটি আড়াল করতে চাই যার কোনও ব্যবহার বা প্রয়োজন নেই Context
। বা আরও খারাপ, আইএমএমের প্রয়োজন আপনার কী -বোর্ড FROM থেকে লুকিয়ে রাখতে চান তা View
(বা আরও খারাপ, কী Window
) নির্দিষ্ট করতে হবে ।
এটি কি-বোর্ডকে আড়াল করা এত চ্যালেঞ্জের করে তোলে। প্রিয় গুগল: আমি যখন একটি কেকের রেসিপিটি সন্ধান করি, তখন নেইRecipeProvider
পৃথিবীতে এমন যা আমাকে প্রথমে রেসিপিটি সরবরাহ করতে অস্বীকার করবে যদি না আমি প্রথমে জবাব দিই যে ডাব্লু কে কাকে খাবেন এবং কোথায় খাবেন !!
এই দু: খজনক কাহিনীটি কুৎসিত সত্যের সাথে শেষ হয়েছে: অ্যান্ড্রয়েড কীবোর্ডটি লুকানোর জন্য আপনাকে সনাক্তকরণের 2 টি রূপ সরবরাহ করতে হবে: ক Context
এবং হয় একটি View
বা একটি Window
।
আমি একটি স্ট্যাটিক ইউটিলিটি পদ্ধতি তৈরি করেছি যা কাজটি খুব দৃly়তার সাথে করতে পারে, আপনি যদি এটির কাছ থেকে কল করেন তবে Activity
।
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
//Find the currently focused view, so we can grab the correct window token from it.
View view = activity.getCurrentFocus();
//If no view currently has focus, create a new one, just so we can grab a window token from it
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
সচেতন হন যে এই ইউটিলিটি পদ্ধতিটি কেবলমাত্র যখন থেকে ডেকে আসে তখনই কাজ করে Activity
! উপরোক্ত পদ্ধতির getCurrentFocus
লক্ষ্য কলActivity
যথাযথ উইন্ডো টোকেন আনতে ।
তবে ধরুন আপনি একটি EditText
হোস্ট করা কীবোর্ডটি আড়াল করতে চান DialogFragment
? আপনি তার জন্য উপরের পদ্ধতিটি ব্যবহার করতে পারবেন না:
hideKeyboard(getActivity()); //won't work
এটি কাজ করবে না কারণ আপনি Fragment
এর হোস্টের একটি রেফারেন্স দিচ্ছেন Activity
, যা Fragment
প্রদর্শিত হওয়ার পরে কোনও ফোকাসড নিয়ন্ত্রণ থাকবে না! কি দারুন! সুতরাং, খণ্ডগুলি থেকে কীবোর্ডটি লুকানোর জন্য, আমি নিম্ন-স্তরের, আরও সাধারণ এবং কৃপণতার অবলম্বন করি:
public static void hideKeyboardFrom(Context context, View view) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
নীচে এই সমাধানটির পশ্চাদ্ধাবন করে আরও সময় নষ্ট থেকে আটকানো অতিরিক্ত কিছু তথ্য রয়েছে:
উইন্ডোসফট ইনপুটমোড সম্পর্কে
সচেতন হওয়ার মতো আরও একটি বিতর্ক রয়েছে। ডিফল্টরূপে, অ্যান্ড্রয়েড স্বয়ংক্রিয়ভাবে আপনার প্রথম EditText
বা ফোকাসযোগ্য নিয়ন্ত্রণকে প্রাথমিক ফোকাস বরাদ্দ করবে Activity
। এটি স্বাভাবিকভাবে অনুসরণ করে যে ইনপুটমেথড (সাধারণত সফ্ট কীবোর্ড) নিজেই দেখিয়ে ফোকাস ইভেন্টটিতে প্রতিক্রিয়া জানাবে। windowSoftInputMode
মধ্যে অ্যাট্রিবিউট AndroidManifest.xml
, যখন সেট stateAlwaysHidden
, কীবোর্ড এই স্বয়ংক্রিয়ভাবে নির্ধারিত প্রাথমিক ফোকাস উপেক্ষা করার নির্দেশ দেয়।
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
প্রায় অবিশ্বাস্যরূপে, আপনি যখন কন্ট্রোলটি স্পর্শ করবেন তখন ( focusable="false"
এবং / অথবা focusableInTouchMode="false"
নিয়ন্ত্রণে নির্ধারিত না হয়ে থাকে) কীবোর্ডটি খোলার থেকে রোধ করার জন্য কিছুই করে না বলে মনে হয় । স্পষ্টতই, উইন্ডোসফট ইনপুটমোড সেটিংসটি কেবলমাত্র স্বয়ংক্রিয় ফোকাস ইভেন্টগুলিতে প্রযোজ্য, স্পর্শ ইভেন্টগুলির দ্বারা ট্রিগার হওয়া ইভেন্টগুলিকে ফোকাস করার জন্য নয়।
সুতরাং, stateAlwaysHidden
খুব খারাপভাবে প্রকৃত নাম দেওয়া হয়েছে। ignoreInitialFocus
পরিবর্তে এটি বলা উচিত ।
আশাকরি এটা সাহায্য করবে.
আপডেট: উইন্ডো টোকেন পাওয়ার আরও উপায়
যদি কোনও দৃষ্টি নিবদ্ধ করা ভিউ না থাকে (যেমন আপনি কেবলমাত্র টুকরোগুলি পরিবর্তন করেছেন তবে ঘটতে পারে), এমন অন্যান্য মতামত রয়েছে যা একটি কার্যকর উইন্ডো টোকেন সরবরাহ করবে।
এগুলি উপরের কোডের বিকল্প if (view == null) view = new View(activity);
এগুলি আপনার ক্রিয়াকলাপের সাথে স্পষ্টভাবে উল্লেখ করে না।
একটি খণ্ড শ্রেণীর ভিতরে:
view = getView().getRootView().getWindowToken();
fragment
পরামিতি হিসাবে একটি খণ্ড দেওয়া :
view = fragment.getView().getRootView().getWindowToken();
আপনার বিষয়বস্তু থেকে শুরু:
view = findViewById(android.R.id.content).getRootView().getWindowToken();
আপডেট 2: আপনি ব্যাকগ্রাউন্ড থেকে অ্যাপটি খুললে আবার কীবোর্ড না দেখাতে ফোকাস সাফ করুন
পদ্ধতির শেষে এই লাইনটি যুক্ত করুন:
view.clearFocus();