অ্যান্ড্রয়েড সফট কীবোর্ড বন্ধ / লুকান


3817

আমি একটি EditTextএবং একটি আছেButtonআমার লেআউটে আছে।

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

কীবোর্ডের বাইরে স্পর্শ করার সময়।


13
আপনার যদি কেবলমাত্র একটি সম্পাদনা পাঠ এবং কয়েকটি বোতাম, যেমন চেক বাক্স এবং রেডিও থাকে? আপনার কীবোর্ডের প্রয়োজন কেবলমাত্র একক সম্পাদনা পাঠের মধ্যে। কীবোর্ডটি আড়াল করার জন্য অন্য কিছু বেছে নেওয়া / ক্লিক করা হয়েছিল তা জানতে আপনি কীভাবে নিবন্ধন করবেন?
অ্যালিকেলজিন-কিলাকা

14
আমাকে বোকা লাগছে. আমি আইসিএসে কীবোর্ডটি আড়াল করতে অক্ষম। এখানে সমস্ত পদ্ধতি এবং সেগুলির সংমিশ্রণ চেষ্টা করে দেখুন। কোনভাবেই না. এটি দেখানোর পদ্ধতিটি কার্যকর, তবে আমি যে কোনও উইন্ডো টোকেন, পতাকা লুকানো, ম্যানিফেস্ট সেটিংস বা মোমবাতি কোনও সাধুদের কাছে লুকিয়ে রাখি না। কীবোর্ড শোতে আমি সর্বদা এটি দেখতে পাই: আমি / ল্যাটিনটাইম (396): ইনপুট টাইপ.টায়িপ্লিক এনএলএল নির্দিষ্ট করা হয়েছে ডাব্লু / ল্যাটিন টাইম (396): অপ্রত্যাশিত ইনপুট শ্রেণি: ইনপুট টাইপ = 0x00000000 imeOptions = 0x00000000
রুপস

4
/ ** * এই পদ্ধতিটি নরম কীবোর্ডটি লুকানোর জন্য ব্যবহৃত হয়। * @ পরিমাপের ক্রিয়াকলাপ * / সার্বজনীন শূন্য হাইডসফটকিবোর্ড (ক্রিয়াকলাপ ক্রিয়াকলাপ) {ইনপুটমেথডম্যানেজার ইনপুটমেথডম্যানেজার = (ইনপুটমেথডম্যানেজার) ক্রিয়াকটি.জেটসিসটেম সার্ভিস (ক্রিয়াকলাপ ININPUT_METHOD_SERVICE); ইনপুটমেডোডম্যানেজ.হাইডসফট ইনপুটফ্রুম উইন্ডো (অ্যাক্টিভিটি.জেটকন্টারফোকস ()। getWindowToken (), 0); }
হর্ষাল বেনাকে

এটি আমার জন্য কাজ করেছে
nmxprime

ডিভাইসগুলির সাথে স্ক্রিনের আকার এবং রেজোলিউশন বৃদ্ধি পাচ্ছে, ভার্চুয়াল কীবোর্ড লুকানো কম গুরুত্বপূর্ণ হয়ে উঠছে।
আল-কাঠিরি খালিদ

উত্তর:


2030

এই উন্মাদনাটি পরিষ্কার করতে সাহায্য করতে আমি গুগলের নরম কীবোর্ডের নিখরচায় হাস্যকর আচরণের জন্য সমস্ত অ্যান্ড্রয়েড ব্যবহারকারীদের পক্ষ থেকে ক্ষমা চেয়ে শুরু করতে চাই। একই সাধারণ প্রশ্নের জন্য এতগুলি উত্তর, প্রতিটি পৃথক পৃথক হওয়ার কারণ হ'ল 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();


2
খুব সুন্দর লেখা। তবে একটি জিনিস, আপনি যদি এর উপরে অন্য কোনও ক্রিয়াকলাপ শুরু করেন, যা কীবোর্ডকে ট্রিগার করে, আপনি ফিরে আসার পরে কীবোর্ডটি উপস্থিত থাকবে। শীর্ষের ক্রিয়াকলাপটি বন্ধ করার সময় আপনার পদ্ধতিটি ব্যবহার করে কীবোর্ডটি সরিয়ে ফিক্সড।
ওভিন্দ

3
@rmirabelle একটিতে Fragmentমনে হচ্ছে আপনি ব্যবহার করতে পারবেনgetActivity().getWindow().getDecorView()
ম্যাকএক্স

1
এই পোস্টটি দুর্দান্ত তবে আপনার দুটি খুব গুরুত্বপূর্ণ অংশের অভাব রয়েছে। সূক্ষ্ম পরিবর্তনগুলি প্রতি সংস্করণে করা হয় এবং প্রতি উত্পাদন প্রতি সম্পন্ন হয়। উদাহরণস্বরূপ একটি স্যামসুঙ গ্যালাক্সি এস on-তে আমাদের কিবোর্ডটি আড়াল করার আগে .clearFocus () ব্যবহার করা দরকার ... যদি না হয় তবে কীবোর্ডটি এখনও সম্পাদনের দ্বিতীয় ক্লিকে পপ আপ করবে: এস
ওয়ারপজিট

17
Keyboard.hide();
গুগলের

1
[কিছু দেখুন] .getContext () << ক্রিয়াকলাপের ক্ষেত্রে হতে পারে। এটি সর্বদা একই জিনিস। (অভ্যন্তরীণ পরিষেবাগুলি ব্যতীত ...)
অলিভার ডিকসন

4416

আপনি আপনার ফোকাস করা ভিউ সম্বলিত উইন্ডোটির টোকনে দিয়ে , কল করে, ইনপুটমেথডম্যানেজার ব্যবহার করে ভার্চুয়াল কীবোর্ডটি আড়াল করতে অ্যান্ড্রয়েডকে জোর করতে পারেন hideSoftInputFromWindow

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

এটি কীবোর্ডকে সমস্ত পরিস্থিতিতে লুকিয়ে রাখতে বাধ্য করবে। কিছু ক্ষেত্রে আপনি পাস করতে চাইবেনInputMethodManager.HIDE_IMPLICIT_ONLY কেবলমাত্র কীবোর্ডটি লুকিয়ে থাকেন তা নিশ্চিত করার জন্য আপনি দ্বিতীয় প্যারামিটার হিসাবে যখন ব্যবহারকারী স্পষ্টভাবে এটি প্রদর্শিত হতে বাধ্য করবেন না (মেনু চেপে ধরে)।

দ্রষ্টব্য: আপনি যদি কোটলিনে এটি করতে চান তবে ব্যবহার করুন: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

কোটলিন সিনট্যাক্স

// Check if no view has focus:
 val view = this.currentFocus
 view?.let { v ->
  val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager 
  imm?.hideSoftInputFromWindow(v.windowToken, 0)
 }

14
ধন্যবাদ 0 টি দ্বিতীয় প্যারামিটার হিসাবে ব্যবহার করে এটি দুর্দান্ত কাজ করে বলে মনে হচ্ছে। তবে আমি যদি ইনপুটমেথডম্যানেজটি ব্যবহার করি। HIDE_IMPLICIT_ONLY কীবোর্ডটি কখনও লুকানো থাকে না (যদিও আমি মেনুটি ধরে রাখছি না)। কোন ইঙ্গিত?
রফ্লকপ্রসটার এক্সসেপশন

27
কুল। কেবল স্পষ্ট করে বলতে গেলে, এটি উপস্থিত থাকলে কেবল এটিকে খারিজ করে দেয়, তবে এটিকে পপিং আপ থেকে আটকাবে না , তাই না?
চিজমিস্টার

15
সফটইনপুট
ইউজার 2224350

111
কলিং editText.clearFocus()তারপর InputMethodManager.HIDE_IMPLICIT_ONLYএমনকি উপর কাজ করে4.1
sprocket12

11
৪.৪ / এইচটিসিতে আমার জন্য কী কাজ করেছে View focused = getCurrentFocus()তা নিশ্চিত হওয়ার জন্য বর্তমানে মনোনিবেশ করা দৃশ্য, কল করা focused.clearFocus()এবং তারপরে inputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)(স্পষ্ট পতাকা সহ) সঠিক ফলাফলটি অর্জন করছিল ।
অয়নোক্লাস্ট ব্রিঘাম

805

সফট-কীবোর্ডটি আড়াল করার জন্যও দরকারী:

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

এটি ব্যবহারকারী সফ্ট-কীবোর্ডকে দমন করতে ব্যবহার করা যেতে পারে যতক্ষণ না ব্যবহারকারী প্রকৃতপক্ষে সম্পাদনা পাঠের দৃশ্যের স্পর্শ করে।


116
ম্যানিফেস্টে আপনার ক্রিয়াকলাপে অ্যান্ড্রয়েড: উইন্ডোসফট ইনপুটমড = "স্টেটহিডেন" যুক্ত করে আপনি একই প্রভাব অর্জন করতে পারেন।
BoD

7
এটিআইপি 9 স্তর 9 এর একটি খণ্ডে (নিজস্ব ক্রিয়াকলাপটি উল্লেখ করে) চেষ্টা করেছিলেন এবং এটি দুর্ভাগ্যক্রমে কার্যকর হয়নি। এটিকে পুনঃসূচনা এবং অনঅ্যাক্টিভিটি তৈরির চেষ্টা করে - কোনও প্রভাব নেই।
এজেন্টকনফফ

2
আমি একটি কথোপকথনে কাজ করছি এবং এটি কাজ করেছে। আমি অ্যান্ড্রয়েড ৩.২ ব্যবহার করছি। আমি এটি অনক্রিটডায়ালগ (বান্ডিল) পদ্ধতিতে রেখেছি। এটি অনক্রিট পদ্ধতিতে কাজ করে নি। ডায়ালগ ডায়ালগ = সুপার.onCreateDialog (সেভড ইনস্ট্যান্সস্টেট); কথোপকথন উইন্ডো ()। সেটসোফট ইনপুটমোড (উইন্ডো ম্যানেজ। লেআউটপ্যারামস। এসএফT_INPUT_STATE_ALWAYS_HIDDEN); ফলাফলটি হ'ল এডিটেক্সটসের সাথে আমার ভিউ কী-বোর্ড ছাড়াই প্রদর্শিত হবে। যখন ব্যবহারকারী কোনও সম্পাদনা পাঠ্য স্পর্শ করে, কীবোর্ডটি প্রদর্শিত হয়।
ফ্লোবকা

4
যখন ফোকাসটি এখনও সম্পাদনা পাঠ্য (যেমন, একটি বোতাম স্পর্শ করার পরে) থাকে তখন এটি কাজ করে না। তার জন্য রেটোর সমাধানটি ব্যবহার করুন।
নুমেনন

4
কেন ম্যানিফেস্ট সেটিংস একটি খারাপ ধারণা? আমি এটি একটি টুকরা থেকে কল করছি। কোনও খণ্ডের জন্য প্রযোজ্য এমন কোনও প্রকাশ্য সেটিং নেই ...
গ্রেগ এনিস

348

কীবোর্ড লুকানোর জন্য আমি আরও একটি সমাধান পেয়েছি:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

এখানে পাস HIDE_IMPLICIT_ONLYএর অবস্থানে showFlagএবং 0এর অবস্থানে hiddenFlag। এটি শক্তভাবে নরম কীবোর্ডটি বন্ধ করবে।


4
আপনি শোফ্ল্যাবসের প্যারামিটারে একটি লুকানো পতাকা ব্যবহার করছেন। এটি কেবলমাত্র কাজ করে কারণ ধ্রুবকরা একই পূর্ণসংখ্যা ব্যবহার করে। সঠিক পতাকা ব্যবহারের উদাহরণ
অ্যালেক্স

অ্যান্ড্রয়েড on.০-তে পরীক্ষিত, আমি এই সমাধানটি পছন্দ করি কারণ আমার একাধিক সম্পাদনা পাঠ্য রয়েছে, সেই ক্রিয়াকলাপের বোতাম রয়েছে, এতে ফোকাস থাকতে পারে

32
@Mark: পদ্ধতি "toggleSoftInput" বলা হয় কারণ, নয় "hideSoftInput" :)
Sver

19
এই সমাধানটি কীবোর্ডটি লুকিয়ে থাকলে দেখায়। এটি সঠিক নয়
মাইকেল ক্যাটকভ

1
@ আকাশ আগরওয়াল - কীবোর্ডটি প্রদর্শিত হওয়ায় এটি কেবল আপনার পক্ষে কাজ করেছে এই বিষয়টি আপনি যদি উপেক্ষা করেন তবে এটি "কাজ করে"। (এটি কীবোর্ডের দৃশ্যমানতা টগল করে: এটি প্রদর্শিত হওয়ার পরে এটি লুকিয়ে থাকে, তবে এটি লুকিয়ে থাকলে তা এটি দেখায় !!) আপনি কী গ্যারান্টি করতে পারেন যে সমস্ত পরিস্থিতিতে, সমস্ত ডিভাইসে, Android এর ভবিষ্যতের সমস্ত সংস্করণের জন্য, কীবোর্ডটি হবে না আপনি এই কল করার সময় দেখাচ্ছে? যদি তাই হয়, তবে এগিয়ে যান এবং এটি ব্যবহার করুন!
টুলমেকারস্টেভ

148

মিয়ার সলিউশন আমার পক্ষেও কাজ করে। আমার ক্ষেত্রে আমার অ্যাপের শীর্ষ স্তরেরটি একটি ট্যাবহস্ট এবং ট্যাবগুলি স্যুইচ করার সময় আমি কীওয়ার্ডটি আড়াল করতে চাই - আমি ট্যাব হোস্ট ভিউ থেকে উইন্ডো টোকন পাই।

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}

আমি এটি সার্চভিউয়ের সাথেও কাজ করতে পেরেছি। আমার উত্তরের জন্য নীচে দেখুন। ধন্যবাদ ম্যাকোস!
আজুরস্পট

138

দয়া করে নীচে কোডটি চেষ্টা করে দেখুন onCreate()

EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);

2
এই পদ্ধতিটি 2.0+ এবং 2.1 তে "সফট কীবোর্ডটি আড়াল করতে পারে না" বাগের কাছাকাছি আসার মাধ্যম হিসাবে কাজ করে যা কোড. google.com/p/android/issues/detail?id=7115 তে বর্ণিত হয়েছে ... hideSoftInputFromWindow পদ্ধতি উপরের তালিকাবদ্ধগুলি চেষ্টা করার পরে কাজ করে নি, তবে editView.setInputType (0) তা করেছে।
স্পাইক উইলিয়ামস

18
এটি editView.setInputType(InputType.TYPE_NULL);
জাভাডোকের

3
এটি কাজ করে তবে এটি অ্যান্ড্রয়েড: ইঙ্গিতটি লুকায়। আমি অ্যান্ড্রয়েড 1.5 ব্যবহার করছি
তীর্থ

এটির জন্য দুর্দান্ত যখন আপনার কোনও ডায়লগ থেকে কীবোর্ডটি বন্ধ করতে হবে, কোনও দৃষ্টান্ত বা কিছু পাওয়ার দরকার নেই এবং ব্যবহারকারী যখন ডায়ালগটি বন্ধ করে দেয় এমন একটি বোতাম চাপলে সমস্ত সম্পাদনা পাঠ্যগুলিতে এটি বরাদ্দ করতে পারে
I_With_Stupid

এটি কাজ করে তবে এটি কার্সারটিও আড়াল করছে। আমার কার্সার দরকার তবে সিস্টেম কীবোর্ড নেই।
স্টিফান ব্রেন্ডল

128

আপডেট: আমি জানি না কেন এই সমাধানটি আর কাজ করে না (আমি কেবল Android 23 এ পরীক্ষা করেছি) on পরিবর্তে সৌরভ পরিকের সমাধানটি ব্যবহার করুন । এটা এখানে:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

পুরানো উত্তর:

//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

8
আমি এই কোডটি কোথায় রাখব? আমি getWindow ()। সেটসফট ইনপুটমোড (উইন্ডো ম্যানেজ। লেআউটপ্যারামস.স.ফ। অনক্রিটে () তবে কীবোর্ডটি কখনই লুকানো থাকে না
ব্যবহারকারী 2236096

কাজ করে না, রেডিওগ্রুপ.সেটঅনচেকডড চেঞ্জলিস্টার, এপিআই 23 তে পরীক্ষিত
ক্রিশ্চিয়ান

আপনি যদি ঘনিষ্ঠভাবে দেখেন তবে ইনপুটমেথডমনেজ। HIDE_IMPLICIT_ONLY এবং ইনপুটমেথডমনেজ.এসএইচএইচও_আইএমপিআইসিআইটির একই মান রয়েছে, যা "1", তাই এই কলগুলির মধ্যে কোনও পার্থক্য নেই। => কাজ করছে না
প্লেজান্দ্রো

যদি im.toggleSoftInput কল করা হয় (ইনপুটমেথডম্যানেজ। HIDE_IMPLICIT_ONLY, 0); স্ক্রিনে কীবোর্ডটি প্রদর্শিত হবে :) সর্বোত্তম বাস্তবায়ন হ'ল অ্যানড্রয়েড এসডিকে গিথুব / রাইভেন্ডু ১০২৪৪ / অ্যান্ড্রয়েড- কিবোর্ডলিস্টনার লজ্জা
ডুনা

I don't know why this solution is not work any more- কারণ এটি অ্যান্ড্রয়েড , সবকিছুই বদলাতে সক্ষম হবে, সম্ভবত আংশিকভাবে খারাপ ডিজাইনের ... আমরা অযত্নে লিখি, তারপরে আমরা সমস্তকে আঘাত করব এবং সমস্ত কিছু আবার লিখি।
কিং কিং

88
protected void hideSoftKeyboard(EditText input) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}

5
এটি আমার পক্ষে কাজ করেছিল! আপনি কেন ইনপুট.সেটপুট টাইপ (0) রাখলেন ? যখন আমার সেই লাইন কোডটি ছিল তখন আমি এডিটেক্সটভিউয়ের সাথে আলাপচারিতা করতে পারি না (আমি এটি সরিয়ে দেওয়ার পরে এটি কাজ করেছিল)।
ymerdrengene

সম্ভবত input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
কুলমাইন্ড

আমি input.setInputType(0);এই কোড থেকে সরিয়েছি । এটি একটি কীবোর্ড আচরণ এবং এর inputTypeজন্য পরিবর্তন করেছে EditText
কুলমাইন্ড

73

যদি এখানে অন্যান্য সমস্ত উত্তর আপনার পক্ষে যেমন কাজ করতে চান তেমন কাজ না করে, ম্যানুয়ালি কীবোর্ডকে নিয়ন্ত্রণ করার আরও একটি উপায় রয়েছে।

এর সাথে কিছু বৈশিষ্ট্য পরিচালনা করবে এমন একটি ফাংশন তৈরি করুন EditText:

public void setEditTextFocus(boolean isFocused) {
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);

    if (isFocused) {
        searchEditText.requestFocus();
    }
}

তারপরে, নিশ্চিত হয়ে নিন যে আপনি কীফোনটি কীবোর্ডটি EditTextখোল / বন্ধ করেছেন:

searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (v == searchEditText) {
            if (hasFocus) {
                // Open keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
            } else {
                // Close keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
            }
        }
    }
});

এখন, আপনি যখনই কীবোর্ডটি ম্যানুয়ালি খুলতে চান কল করুন:

setEditTextFocus(true);

এবং কল বন্ধ করার জন্য:

setEditTextFocus(false);

+1 - আপনি যদি বদ্ধ কীবোর্ডের সাথে কোনও ক্রিয়াকলাপ শুরু করতে চান তবে এই সমাধানটি ব্যবহার করুন এবং একটি অনক্লিক্লিস্টার যুক্ত করুন যা সেটএডিটটেক্সটফোকস (সত্য) সেট করে। মোহন মত কাজ!
schlingel

কোডের দ্বিতীয় ব্লকের 7th ম এবং দশম লাইনে আমি 'প্রতীক প্রসঙ্গে সমাধান করতে পারছি না' পেয়েছি।
gimmegimme

পরিবর্তে getContext () ব্যবহার করুন
রোটেমিমিজ

61

সৌরভ পরিকএ পর্যন্ত সেরা উত্তর আছে ।

যদিও সঠিক পতাকা ব্যবহার করতে পারে।

/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

বাস্তব ব্যবহারের উদাহরণ

/* click button */
public void onClick(View view) {      
  /* hide keyboard */
  ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
      .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

  /* start loader to check parameters ... */
}

/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
    /* parameters not valid ... */

    /* show keyboard */
    ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
        .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

    /* parameters valid ... */
}

1
এটি সর্বশেষতম সংস্করণের জন্য সবচেয়ে দক্ষ। পুরানো সংস্করণগুলির জন্য এটির সর্বদা একটি টুইট করতে হবে। বিশেষত v3 এর আগে।
অ্যালেক্স

2
@ মাজন: ব্যবহারfragment.getActivity().getSystemService();
জোহান এস

এটি শো এবং গোপন উভয়কেই কভার করে, এটি সর্বাধিক ব্যাপক উত্তর।
আন্দ্রে স্টাল্টজ

4
নং, আমার স্যামসাং ট্যাব, অ্যান্ড্রয়েড 5.0 এ, উপরের তথাকথিত "হাইড কীবোর্ড" কোডটি নরম কীবোর্ডটি টগল করবে - যদি এটি ইতিমধ্যে লুকানো থাকে তবে এটি এটি দেখিয়ে দেবে। এই ফাংশনটির নামে টগল থাকার একটি কারণ রয়েছে।
টুলমেকারস্টেভ

57

এত অনুসন্ধান থেকে, আমি এখানে একটি উত্তর পেয়েছি যা আমার পক্ষে কাজ করে

// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

অ্যান্ড্রয়েড 5.1
জিএমএক্স

55

সংক্ষিপ্ত উত্তর

আপনার OnClickশ্রোতা কল onEditorActionএর EditTextসঙ্গেIME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
    }
});

ড্রিল ডাউন

আমি অনুভব করি যে এই পদ্ধতিটি আরও ভাল, সহজ এবং আরও অ্যান্ড্রয়েডের ডিজাইন প্যাটার্নের সাথে একত্রিত। উপরের সরল উদাহরণে (এবং সাধারণত বেশিরভাগ সাধারণ ক্ষেত্রে) আপনার এমন একটি থাকবে EditTextযার মধ্যে ফোকাস ছিল / ছিল এবং সাধারণত এটিই প্রথম স্থানে কীবোর্ডটি আহ্বান করত (এটি অবশ্যই এটি অনেকগুলিতে আবেদন করতে সক্ষম হয়) সাধারণ পরিস্থিতি)। যে একই ভাবে, এটা কীবোর্ড মুক্তি একটি হতে হবে, সাধারণত যে দ্বারা করা সম্ভব ImeAction। শুধু কিভাবে একটি দেখতে EditTextসঙ্গে android:imeOptions="actionDone"আচরণ করবে, আপনি একই উপায়ে একই আচরণ অর্জন করতে চান।


এই সম্পর্কিত উত্তর পরীক্ষা করুন


এই উত্তর। ক্রস সংস্করণে কাজ করে এমন একমাত্র পদ্ধতি। আমি এই প্রশ্নের উত্তরটি পোস্ট করতে ফিরে এসেছি কারণ আমি ভাবিনি যে অন্য কেউ জানেন
নোহ পাসালাক্কুয়া

এটি সঠিক উত্তর হওয়া উচিত। অ্যান্ড্রয়েডকে কীবোর্ডটি সত্যিকার অর্থে উপস্থিত হওয়ার পরে লুকিয়ে রাখার পরিবর্তে, আমরা এটি বলি যে ব্যবহারকারীটি সম্পন্ন হয়েছে, যার ফলে একই আইমেএ্যাকশন [বোকামির নাম, আমি স্বীকার করি] চালু হয় যেন ব্যবহারকারী কীবোর্ডে "সম্পন্ন" ক্লিক করেছেন । যদি ব্যবহারকারী কীবোর্ডে ইনপুট নিশ্চিত করে বা ইউআই বোতামটি ট্যাপ করে তবে এটি কোনও তফাত্ করবে না।
অলিভার হাউসলার

46

এই কাজ করা উচিত:

public class KeyBoard {

    public static void show(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
    }

    public static void hide(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
    }

    public static void toggle(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm.isActive()){
            hide(activity); 
        } else {
            show(activity); 
        }
    }
}

KeyBoard.toggle(activity);

আংশিক পরিশ্রম করেছেন, এমনকি কীবোর্ডটি লুকিয়ে থাকলেও "isActive ()" মিথ্যা ফেরত দেয়!
xpto

অবশ্যই এটি করা উচিত, এটা অনুমিত। অথবা আমি আপনাকে বুঝতে পারি না। যাইহোক, আপনি কখন শ্রেণিটি সরবরাহ করতে পারেন hide()এবং show()কখন এটি প্রদর্শিত হবে এবং কখন হবে না তার উপর আরও নিয়ন্ত্রণের পদ্ধতিগুলি থাকতে পারে। আমার জন্য কাজ করে, আমি এটিও করেছি :) আমি উদাহরণটি সম্পাদনা করব
slinden77

@ ইউসু আলেয়াউব হ্যাঁ এটি করবে। KeyBoard.toggle(fragment.getActivity())
slinden77

@ স্লিনডেন 7777, হ্যাঁ, আমি আপনার উত্তরের কথা বলছি ... আপনি মন্তব্য করেছেন এমনটি নয়। সুতরাং সেই উত্তরটি এখনও কাজ করবে না।
ইউশা আলেয়াউব

@ ইউসু আলেয়াউব উহম হ্যাঁ এটি হবে। মূল প্রশ্নটিতে টুকরোগুলি উল্লেখ করা হয়নি, আপনিই সেই টুকরো টুকরো উল্লেখ করেছেন। সুতরাং আমার উত্তর পুরোপুরি বৈধ। টুকরো টুকরো দিয়ে এটি ব্যবহার করতে Fragment, একটি মন্তব্যের মতো পদ্ধতিটিকে একটি থেকে আলাদাভাবে কল করুন । কীভাবে পদ্ধতিগুলি ব্যবহার করবেন তা শিখুন এবং তারপরে ফিরে আসুন। আপনি আপনার নির্বোধ জবাব দিয়ে মানুষকে বিভ্রান্ত করছেন
slinden77

43

আমি একটি হেক্স নম্বর ইনপুট করতে একটি কাস্টম কীবোর্ড ব্যবহার করছি যাতে আমি আইএমএম কীবোর্ডটি প্রদর্শিত না করতে পারি ...

V3.2.4_r1 setSoftInputShownOnFocus(boolean show)এ আবহাওয়া নিয়ন্ত্রণ করতে বা কোনও পাঠ্য ভিউতে ফোকাস পাওয়া গেলে কীবোর্ডটি প্রদর্শন না করার জন্য যুক্ত করা হয়েছিল, তবে এটি এখনও লুকানো রয়েছে তাই প্রতিবিম্বটি অবশ্যই ব্যবহার করা উচিত:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    try {
        Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
        method.invoke(mEditText, false);
    } catch (Exception e) {
        // Fallback to the second method
    }
}

পুরানো সংস্করণগুলির জন্য, আমি খুব ভাল ফলাফল পেয়েছি (তবে নিখুঁত থেকে অনেকটা) OnGlobalLayoutListener, ViewTreeObserverআমার রুট ভিউ থেকে এ এর সাহায্যে যুক্ত করা হয়েছে এবং তারপরে কিবোর্ডটি এভাবে দেখানো হয়েছে কিনা তা পরীক্ষা করে দেখছি :

@Override
public void onGlobalLayout() {
    Configuration config = getResources().getConfiguration();

    // Dont allow the default keyboard to show up
    if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
    }
}

এই শেষ সমাধানটি বিভক্ত সেকেন্ডের জন্য কীবোর্ডটি দেখাতে পারে এবং নির্বাচনের হ্যান্ডেলগুলির সাথে মেসেজ করবে।

কীবোর্ডে পূর্ণ পর্দায় প্রবেশ করার পরে, অন্লোবালআলআউট কল হয় না। এটি এড়াতে, টেক্সটভিউ # সেটআইমেওপশনগুলি (ইনট) বা টেক্সটভিউ এক্সএমএল ঘোষণায় ব্যবহার করুন:

android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"

আপডেট: কীওয়ার্ডটি প্রদর্শন করতে কখনও ডায়লগগুলি ব্যবহার করে এবং সমস্ত সংস্করণে কাজ করে তা সবেমাত্র পাওয়া গেছে:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

ধন্যবাদ. দুটি ফ্ল্যাশ FLAG_ALT_FOCUSABLE_IM এবং FLAG_ALT_FOCUSABLE_IM সত্যই আমার ক্ষেত্রে সাহায্যকারী একমাত্র জিনিস। আমি চাইনি যে আমার কার্যকলাপে কোনও কীবোর্ড প্রদর্শিত হবে - এমনকি ব্যবহারকারী কোনও সম্পাদনা পাঠ্য ক্লিক করলেও নয়। (আমি নিজের "কীপ্যাড" তৈরি করেছি)।
ড্যানিয়েল নোভাক

দুর্দান্ত সমাধান, তবে, যদি আপনার সামনের ক্রিয়াকলাপটি পূর্ণ স্ক্রিন না হয় তবে এর পিছনে কীবোর্ড দৃশ্যমান। এছাড়াও কীবোর্ডের কার্সার মুভমেন্ট সহায়তাটি এখনও দৃশ্যমান। এবং এটি চামড়াযুক্ত নয়।
26:43

আমি দ্বিতীয় যে. সমস্ত সম্ভাব্য উপায়ে কেবলমাত্র উইন্ডো ()। সেটফ্ল্যাগস () পদ্ধতিটি কাজ করে, কমপক্ষে স্ট্রোক এন্ড্রয়েড 5.1 এ। নোট করুন যে সেটসোফট ইনপুটশাউনঅনফোকাস () এখন সেটশোসফট ইনপুটঅনফোকাস () এবং এখন আর লুকানো আছে কিন্তু কাজ করে না, কমপক্ষে ব্যবহারকারী ক্ষেত্রটি স্পর্শ করার সময় নয় not
olefevre

আপনার "আপডেট" আমার জন্য একমাত্র কার্যক্ষম সমাধান ছিল। আমি কমপক্ষে দুই ঘন্টা একটি সমাধান খুঁজছি :)
স্টিফান ব্রেন্ডেল

33
public void setKeyboardVisibility(boolean show) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(show){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }else{
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
    }
}

30

থ্রেডে পোস্ট করা সমস্ত সমাধানের মধ্যে দিয়ে আমি দু'দিনেরও বেশি সময় ব্যয় করেছি এবং সেগুলিকে একরকম বা অন্যভাবে অভাব পেয়েছি। আমার সঠিক প্রয়োজনীয়তাটি এমন একটি বোতাম যা 100% নির্ভরযোগ্যতার সাথে স্ক্রীন কীবোর্ডটি প্রদর্শন করে বা লুকিয়ে রাখবে। কীবোর্ডটি যখন তার লুকানো অবস্থায় থাকে তখন আবার প্রদর্শিত হবে না, ব্যবহারকারীরা যে ইনপুট ক্ষেত্র ক্লিক করে তা বিবেচনা করে না। এটি যখন দৃশ্যমান অবস্থায় থাকে তখন ব্যবহারকারী কী কী বোতাম ক্লিক করে তা কীবোর্ডটি মুছে ফেলা উচিত নয়। সর্বশেষতম ডিভাইসগুলি পর্যন্ত এটিকে Android 2.2+ এ কাজ করা দরকার on

আপনি আমার অ্যাপ্লিকেশন ক্লিন আরপিএন এ এর একটি কার্যকর বাস্তবায়ন দেখতে পাবেন ।

বিভিন্ন ফোনে (ফ্রয়েও এবং জিঞ্জারব্রেড ডিভাইস সহ) বেশ কয়েকটি প্রস্তাবিত উত্তর পরীক্ষা করার পরে এটি স্পষ্ট হয়ে উঠল যে অ্যান্ড্রয়েড অ্যাপগুলি নির্ভরযোগ্যভাবে পারেন:

  1. অস্থায়ীভাবে কীবোর্ডটি আড়াল করুন। যখন ব্যবহারকারী কোনও নতুন পাঠ্য ক্ষেত্রে মনোনিবেশ করবে তখন এটি আবার উপস্থিত হবে।
  2. কোনও ক্রিয়াকলাপ শুরু হওয়ার পরে কীবোর্ডটি দেখান এবং ক্রিয়াকলাপে একটি পতাকা সেট করে যা নির্দেশ করে যে তাদের কীবোর্ড সর্বদা দৃশ্যমান হওয়া উচিত। কোনও ক্রিয়াকলাপ শুরু হলে এই পতাকাটি সেট করা যেতে পারে।
  3. কীবোর্ডটি কখনও প্রদর্শন বা ব্যবহারের অনুমতি না দেওয়ার জন্য একটি ক্রিয়াকলাপ চিহ্নিত করুন। কোনও ক্রিয়াকলাপ শুরু হলে এই পতাকাটি সেট করা যেতে পারে।

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

দুর্ভাগ্যক্রমে তালিকার 2 এবং 3 আইটেমটি যখন কোনও ক্রিয়াকলাপ শুরু করা হয় তখন কেবল নির্ভরযোগ্যতা কাজ করে। ক্রিয়াকলাপটি দৃশ্যমান হয়ে গেলে আপনি স্থায়ীভাবে কীবোর্ডটি আড়াল বা প্রদর্শন করতে পারবেন না। কৌশলটি হ'ল ব্যবহারকারী যখন কীবোর্ড টগল বোতামটি টিপেন তখন আপনার ক্রিয়াকলাপটি পুনরায় চালু করা হয়। আমার অ্যাপ্লিকেশনটিতে যখন ব্যবহারকারী টগল কীবোর্ড বোতাম টিপবে, নিম্নলিখিত কোডটি চলবে:

private void toggleKeyboard(){

    if(keypadPager.getVisibility() == View.VISIBLE){
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, true);
        i.putExtras(state);

        startActivity(i);
    }
    else{
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, false);
        i.putExtras(state);

        startActivity(i);
    }
}

এটি বর্তমান ক্রিয়াকলাপটিকে তার রাজ্যটিকে একটি বান্ডিলে সংরক্ষণ করতে বাধ্য করে এবং তারপরে ক্রিয়াকলাপটি শুরু করা হয়, এমন একটি বুলিয়ান দিয়ে যা যা নির্দেশ করে যে কীবোর্ডটি প্রদর্শিত বা লুকানো উচিত।

অনক্রিট পদ্ধতিতে নীচের কোডটি চালিত হয়:

if(bundle.getBoolean(SHOW_KEYBOARD)){
    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
    getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

যদি নরম কীবোর্ডটি দেখানো উচিত, তবে ইনপুটমেথডম্যানেজারকে কীবোর্ডটি দেখাতে বলা হয় এবং উইন্ডোটি নরম ইনপুটটি সর্বদা দৃশ্যমান করার জন্য নির্দেশিত হয়। যদি নরম কীবোর্ডটি লুকানো থাকে তবে উইন্ডো ম্যানেজ.লয়আউটপ্যারামস.ফ্ল্যাজ_এলT_FOCUSABLE_IM সেট করা আছে।

4 বছর বয়সী এইচটিসি ফোন চলমান অ্যান্ড্রয়েড 2.2 থেকে চলমান একটি নেক্সাস 7 চলমান 4.2.2 পর্যন্ত 4 টি পুরানো এইচটিসি ফোন থেকে শুরু করে সমস্ত ডিভাইসে এই পদ্ধতিটি নির্ভরযোগ্যভাবে কাজ করে। এই পদ্ধতির একমাত্র অসুবিধাটি হ'ল পিছনের বোতামটি হ্যান্ডল করার ক্ষেত্রে আপনাকে সতর্ক হওয়া দরকার। যেহেতু আমার অ্যাপ্লিকেশনটিতে কেবলমাত্র একটি পর্দা রয়েছে (এটির একটি ক্যালকুলেটর) আমি অনব্যাকপ্রেসড () টি ওভাররাইড করতে পারি এবং ডিভাইসগুলির হোম স্ক্রিনে ফিরে আসতে পারি।


1
বিস্তৃত কাজ, কিন্তু আমার মনে হয় কেবল কীবোর্ডটি আড়াল করার জন্য হাজার হাজার বস্তুটি পুনরায় তৈরি করা এটি খুব বেশি। আইএমএম কে অ্যান্ড্রয়েডের জন্য ডিজাইন করেছেন তা আমি জানি না, তবে এটি একটি উইন্ডোজ এপিআইয়ের মতো গন্ধযুক্ত। আমার মতে, একটি ভাল
আইএমইতে

এগুলি সমস্ত সত্য, তবে আমার কাজের দিক থেকে একটি সুবিধা রয়েছে - এটি সর্বদা কার্যকর হয়! ইউআই-তে কোন ক্ষেত্রের ফোকাস রয়েছে, ব্যবহারকারী টগল করতে এবং কি-বোর্ড কীভাবে ব্যবহার করেছে এবং এন্ড্রয়েডের কী সংস্করণ তারা চলছে তা নির্বিশেষে আমি অন্য কোনও সমাধান খুঁজে পাইনি যা সর্বদা কীবোর্ড টগল করতে পারে:
Luke

ম্যান, আমি কীবোর্ডটি আড়াল করতে পুরোপুরি মরিয়া। কয়েক হাজার জিনিস এবং নূুন কাজ করার চেষ্টা করেছেন। তবে আপনার কাজটি আমার পক্ষে অনেক বেশি, আমাকে 10 টি টুকরোগুলির মতো পুনরায় তৈরি করতে হবে, পরিষেবাগুলি শুরু করতে হবে, প্রচুর WeakReferences মুছতে হবে .... আপনি কি জানেন? জিসি কেবল 25 এমবি: এসের মতো ফেলে দেবে: এস এখনও এটি করার একটি নির্ভরযোগ্য উপায় খুঁজছেন :(
রুপস

@ দিমিত্রি ভাল এটি কোনও হ্যালো ওয়ার্ল্ড নয় ... এটি ট্যাবলেটগুলির জন্য একটি জটিল অ্যাপ্লিকেশন। আমি কেবল মূর্খ কীবোর্ডটি লুকানোর জন্য এটিকে সম্পূর্ণরূপে স্মৃতি থেকে আনডোল করতে অস্বীকার করেছি ... যাইহোক আমি এখানে এমন কিছু প্রস্তাব পেয়েছি যা এখানে প্রস্তাবিত হাজার সমাধানের সংমিশ্রণে কাজ করে :)
রুপস

27

বিকল্প হিসাবে এই চারিদিক সমাধানের জন্য , আপনি কিবোর্ড খোলার জন্য ব্যবহৃত (সম্পাদনা পাঠ্য) ক্ষেত্রের রেফারেন্স না দিয়ে কোথাও থেকে নরম কীবোর্ডটি বন্ধ করতে চান , তবে ক্ষেত্রটি কেন্দ্রীভূত থাকলে এটি করতে চাইলে আপনি ব্যবহার করতে পারেন এটি (একটি কার্যকলাপ থেকে):

if (getCurrentFocus() != null) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}

25

ধন্যবাদ এই উত্তরটির , আমি নিম্নলিখিতটি পেয়েছি যা আমার ক্ষেত্রে ভিউপ্যাজারের টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে স্ক্রোল করার সময় সুন্দরভাবে কাজ করে ...

private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

private void showKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    }
}

21

উপরের উত্তরগুলি বিভিন্ন দৃশ্যের জন্য কাজ করে তবে আপনি যদি কোনও ভিউয়ের মধ্যে কীবোর্ডটি আড়াল করতে চান এবং সঠিক প্রসঙ্গটি পেতে সংগ্রাম করছেন তবে এটি চেষ্টা করুন:

setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        hideSoftKeyBoardOnTabClicked(v);
    }
}

private void hideSoftKeyBoardOnTabClicked(View v) {
    if (v != null && context != null) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

এবং প্রসঙ্গে কনস্ট্রাক্টরের কাছ থেকে এটি আনতে :)

public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
    init();
}

18

আপনি যদি ইউনিট বা কার্যকরী পরীক্ষার সময় নরম কীবোর্ডটি বন্ধ করতে চান, আপনি নিজের পরীক্ষা থেকে "পিছনে বোতাম" ক্লিক করে এটি করতে পারেন:

// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

আমি উদ্ধৃতিগুলিতে "পিছনে বোতাম" রেখেছি, যেহেতু onBackPressed()উপরেরগুলি ক্রিয়াকলাপে প্রশ্নের জন্য ট্রিগার করে না । এটি কেবল কীবোর্ডটি বন্ধ করে দেয়।

সামনের দিকে যাওয়ার আগে কিছুক্ষণ বিরতি দেওয়ার বিষয়টি নিশ্চিত করুন, যেহেতু পিছনের বোতামটি বন্ধ করতে কিছুটা সময় লাগে, সুতরাং পরবর্তী সময়ে ভিউ ইত্যাদিতে ক্লিকগুলি সংক্ষিপ্ত বিরতির পরে নিবন্ধিত হবে না (1 সেকেন্ড দীর্ঘ যথেষ্ট আইম )।


16

আপনি অ্যান্ড্রয়েডের জন্য মনোতে এটি কীভাবে করবেন তা এখানে (একে একে মনোড্রয়েড)

InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
    imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);

1
searchboxস্নিপেটে কী আছে ?
পিসিওডার

16

এটি আমার কাছে সমস্ত উদ্ভট কীবোর্ড আচরণের জন্য কাজ করেছিল

private boolean isKeyboardVisible() {
    Rect r = new Rect();
    //r will be populated with the coordinates of your view that area still visible.
    mRootView.getWindowVisibleDisplayFrame(r);

    int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top);
    return heightDiff > 100; // if more than 100 pixels, its probably a keyboard...
}

protected void showKeyboard() {
    if (isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (getCurrentFocus() == null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    } else {
        View view = getCurrentFocus();
        inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
    }
}

protected void hideKeyboard() {
    if (!isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View view = getCurrentFocus();
    if (view == null) {
        if (inputMethodManager.isAcceptingText())
            inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
    } else {
        if (view instanceof EditText)
            ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
        inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

1
মনে করি আমি এর আগে 10 টি উত্তর চেষ্টা করেছি। আশা ছেড়ে দিয়েছিল। ধন্যবাদ মানুষ.
বোলিং

এমরুটভিউ কী?
justdan0227

14

android:windowSoftInputMode="stateHidden"ম্যানিফেস্ট ফাইলটিতে আপনার ক্রিয়াকলাপে যুক্ত করুন। উদাহরণ:

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>

14

সহজ এবং ব্যবহার পদ্ধতি সহজ, কেবল হাইডকি-বোর্ডবোর্ড থেকে কল করুন (আপনারঅ্যাক্টিভিটি.এটি); কীবোর্ড আড়াল করতে

/**
 * This method is used to hide keyboard
 * @param activity
 */
public static void hideKeyboardFrom(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

13

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

if (this.getCurrentFocus() != null) {
    InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

ঠিকভাবে কাজ করে. ধন্যবাদ
আলিফ

12
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

অন ​​টুচলিস্টনার এ কল করার পরে:

findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Utils.hideSoftKeyboard(activity);
        return false;
    }
});

এটিও চেষ্টা করে দেখুন - এটি আমার জন্য কাজ করেছে: ইনপুটমেথডম্যানেজার ইমিট = ((ইনপুটমেথডম্যানেজার) গিস্টিস্টেম সার্ভিস (ক্রিয়াকলাপ ININPUT_METHOD_SERVICE)); im.hideSoftInputFromWindow (getWindow ()। getCenterFocus ()। getWindowToken (), 0);
zmicer


12

আমার ক্ষেত্রে, আমি অ্যাকশনবারে একটি অনুসন্ধান ভিউ ব্যবহার করছিলাম। কোনও ব্যবহারকারী কোনও অনুসন্ধান সম্পাদন করার পরে, কীবোর্ডটি আবার পপ হবে।

ইনপুটমেথডম্যানেজার ব্যবহার করে কীবোর্ডটি বন্ধ হয়নি। আমাকে ফোকাস সাফ করতে হয়েছিল এবং অনুসন্ধানের দৃষ্টিভঙ্গিকে মিথ্যাতে সেট করতে হয়েছিল:

mSearchView.clearFocus();
mSearchView.setFocusable(false);

1
খুব চালাক. ব্যবহারকারী যদি অন্য অনুসন্ধান চান তবে কেবল আবার অনুসন্ধানে ক্লিক করুন।
অ্যালেক্স

অনুসন্ধান ভিউয়ের clearFocus()অ্যান্ড্রয়েড এপিআই পৃষ্ঠাগুলিতে একটি নেই, সুতরাং এটি আমার পক্ষে কাজ করে নি, তবে অন্য একটি সমাধানও করেছে (আমার উত্তর নীচে দেখুন)।
Azurespot


12

আমার কেসটি রয়েছে, যেখানে EditTextআমারটিতে এটিও অবস্থিত হতে পারে AlertDialog, তাই কীবোর্ডটি বরখাস্ত করা বন্ধ করা উচিত। নিম্নলিখিত কোডটি যে কোনও জায়গায় কাজ করছে বলে মনে হচ্ছে:

public static void hideKeyboard( Activity activity ) {
    InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
    View f = activity.getCurrentFocus();
    if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
        imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
    else 
        activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}

1
এই সমাধানটি আরও ভাল কারণ আপনি কোন সম্পাদনা পাঠ্যকে হাইডসফট ইনপুটফ্রম উইন্ডো () পদ্ধতিতে প্যারামিটার হিসাবে পাস করবেন তা নিয়ন্ত্রণ করতে হবে না। এটা দুর্দান্ত কাজ করে !!
বিলিজোকার

12

আমি প্রায় এই সমস্ত উত্তর চেষ্টা করেছি, আমার কিছু এলোমেলো সমস্যা ছিল বিশেষত সামসঙ গ্যালাক্সি এস 5 এর সাথে।

আমি যা শেষ করি তা হ'ল শো এবং লুকিয়ে রাখতে বাধ্য করা এবং এটি পুরোপুরি কার্যকর হয়:

/**
 * Force show softKeyboard.
 */
public static void forceShow(@NonNull Context context) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

/**
 * Force hide softKeyboard.
 */
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
    if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
        editText.requestFocus();
    }
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.