Düzenimde bir EditText
ve bir var Button
.
Düzenleme alanına yazıp Button
sanal klavyeyi gizlemek istiyorum. Bunun basit bir kod parçası olduğunu varsayıyorum, ancak bunun bir örneğini nerede bulabilirim?
Klavyenin dışına dokunduğunuzda.
Düzenimde bir EditText
ve bir var Button
.
Düzenleme alanına yazıp Button
sanal klavyeyi gizlemek istiyorum. Bunun basit bir kod parçası olduğunu varsayıyorum, ancak bunun bir örneğini nerede bulabilirim?
Klavyenin dışına dokunduğunuzda.
Yanıtlar:
Bu çılgınlığı açıklığa kavuşturmak için, Google'ın yumuşak klavyeye düpedüz saçma tedavisi için tüm Android kullanıcıları adına özür dileyerek başlamak istiyorum. Aynı basit soru için her biri farklı olan birçok cevabın olmasının nedeni, bu API'nin Android'deki diğerleri gibi korkunç bir şekilde tasarlanmış olmasıdır. Bunu açıklamak için kibar bir yol düşünemiyorum.
Klavyeyi gizlemek istiyorum. Ben şu ifadeyle Android'i vermenizi bekliyoruz: Keyboard.hide()
. Son. Çok teşekkür ederim. Ancak Android'in bir sorunu var. InputMethodManager
Klavyeyi gizlemek için tuşunu kullanmanız gerekir . Tamam, tamam, bu Android'in klavyenin API'sı. FAKAT! Context
IMM'ye erişmek için bir a'ya sahip olmanız gerekir . Şimdi bir sorunumuz var. Klavyeyi, herhangi bir kullanımı veya ihtiyacı olmayan bir statik veya yardımcı sınıftan gizlemek isteyebilirsiniz Context
. veya Ve daha da kötüsü, IMM klavyeyi FROM'dan gizlemek istediğinizi View
(veya daha da kötüsünü, ne Window
) belirtmenizi gerektirir .
Klavyeyi gizlemeyi bu kadar zorlaştıran şey budur. Sevgili Google: Bir pasta tarifi ararken RecipeProvider
, kekin kim tarafından yeneceği VE nerede yenileceği konusunda ilk cevap vermediğim sürece Dünya'da bana tarif vermeyi reddeden hiçbir şey yok !
Bu üzücü hikaye çirkin gerçeklerle bitiyor: Android klavyeyi gizlemek için 2 kimlik biçimi sağlamanız gerekecek: a Context
ve a View
veya a Window
.
Ben bir çağrı çağırmak şartıyla ÇOK katı bir şekilde iş yapabilirsiniz statik bir yarar yöntemi oluşturduk 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);
}
Bu yardımcı yöntem SADECE bir den çağrıldığında çalışır unutmayın Activity
! Yukarıdaki yöntem , uygun pencere belirtecini getirmek için getCurrentFocus
hedefi çağırır Activity
.
Ama varsayalım ki klavyeyi EditText
barındırılan bir bilgisayardan gizlemek mi istiyorsunuz DialogFragment
? Bunun için yukarıdaki yöntemi kullanamazsınız:
hideKeyboard(getActivity()); //won't work
Bu işe yaramaz çünkü gösterilirken odaklanmış kontrolü olmayacak olan Fragment
'ın ana bilgisayarına bir referans Activity
geçireceksiniz Fragment
! Vaov! Bu nedenle, klavyeyi parçalardan gizlemek için daha düşük seviyeli, daha yaygın ve çirkin olanlara başvuruyorum:
public static void hideKeyboardFrom(Context context, View view) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Aşağıda, bu çözümü kovalayarak daha fazla zaman harcanan bazı ek bilgiler verilmiştir:
WindowSoftInputMode hakkında
Dikkat edilmesi gereken başka bir tartışma konusu daha var. Varsayılan olarak, Android başlangıç odağınızı otomatik olarak ilk EditText
veya odaklanabilir kontrole atar Activity
. Doğal olarak, InputMethod'un (genellikle yumuşak klavye) odak olayına kendisini göstererek yanıt vereceğini izler. Olarak ayarlandığında, windowSoftInputMode
öznitelik klavyeye otomatik olarak atanan bu başlangıç odağını yoksayması talimatını verir.AndroidManifest.xml
stateAlwaysHidden
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
Neredeyse inanılmaz bir şekilde, kontrole dokunduğunuzda klavyenin açılmasını önlemek için hiçbir şey yapmıyor gibi görünüyor ( focusable="false"
ve / veya focusableInTouchMode="false"
kontrole atanmadığı sürece ). Görünüşe göre windowSoftInputMode ayarı, dokunma olayları tarafından tetiklenen olaylara odaklanmak için değil, yalnızca otomatik odak olayları için geçerlidir.
Bu nedenle, stateAlwaysHidden
gerçekten ÇOK kötü adlandırılmış. Bunun ignoreInitialFocus
yerine belki de çağrılmalıdır .
Bu yardımcı olur umarım.
GÜNCELLEME: Pencere simgesi almanın diğer yolları
Odaklanmış bir görünüm yoksa (örneğin, sadece parçaları değiştirdiyseniz olabilir), yararlı bir pencere belirteci sağlayacak başka görünümler de vardır.
Bunlar yukarıdaki kodun alternatifleridir. if (view == null) view = new View(activity);
Bunlar açıkça etkinliğinizle ilgili değildir.
Bir parça sınıfının içinde:
view = getView().getRootView().getWindowToken();
fragment
Parametre olarak bir parça verildi :
view = fragment.getView().getRootView().getWindowToken();
İçerik gövdenizden başlayarak:
view = findViewById(android.R.id.content).getRootView().getWindowToken();
GÜNCELLEME 2: Uygulamayı arka plandan açarsanız klavyenin tekrar gösterilmesini önlemek için net netleme
Bu satırı yöntemin sonuna ekleyin:
view.clearFocus();
Fragment
şey vargetActivity().getWindow().getDecorView()
Keyboard.hide();
yardımcı programı sağlamalıdır
Android'i , odaklanmış görünümünüzü içeren pencerenin belirtecini kullanarak , çağrı yaparak , InputMethodManager'ı kullanarak sanal klavyeyi gizlemeye zorlayabilirsiniz 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);
}
Bu, klavyeyi her durumda gizlenmeye zorlayacaktır. Bazı durumlarda InputMethodManager.HIDE_IMPLICIT_ONLY
, klavyeyi yalnızca kullanıcı açıkça görünmeye zorlamadığında (menüyü basılı tutarak) klavyeyi gizlemenizi sağlamak için ikinci parametre olarak geçmek isteyeceksiniz .
Not: Bunu Kotlin'de yapmak istiyorsanız, şunu kullanın:
context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
Kotlin Sözdizimi
// 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)
}
editText.clearFocus()
Sonra arama InputMethodManager.HIDE_IMPLICIT_ONLY
bile çalışıyor4.1
View focused = getCurrentFocus()
, kesinlikle o anda odaklanmış görüş, arama focused.clearFocus()
ve ardından inputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)
(açık bayraklarla) olanı elde etmek için yürütüyordu .
Yazılım klavyesini gizlemek için de yararlıdır:
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
Bu, kullanıcı editText Görünümüne gerçekten dokunana kadar ekran klavyesini bastırmak için kullanılabilir.
Klavyeyi gizlemek için bir çözüm daha var:
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
İşte geçmesi HIDE_IMPLICIT_ONLY
konumunda showFlag
ve 0
pozisyonunda hiddenFlag
. Yumuşak Klavyeyi zorla kapatacaktır.
Meier'in çözümü de benim için çalışıyor. Benim durumumda Uygulamamın üst seviyesi bir tabHost ve sekmeleri değiştirirken anahtar kelimeyi gizlemek istiyorum - tabHost View'dan pencere belirtecini alıyorum.
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
public void onTabChanged(String tabId) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
}
}
Lütfen aşağıdaki kodu onCreate()
EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);
editView.setInputType(InputType.TYPE_NULL);
Güncelleme: Bu çözümün neden artık işe yaramadığını bilmiyorum (Android 23'te test ettim). Lütfen bunun yerine Saurabh Pareek'in çözümünü kullanın. İşte burada:
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
Eski cevap:
//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
I don't know why this solution is not work any more
- Android olduğu için , her şey değişebilir, belki de kısmen kötü tasarımdan ... Dikkatsizce yazıyoruz, sonra hepsini dışarı atıyoruz ve her şeyi yeniden yazıyoruz.
protected void hideSoftKeyboard(EditText input) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
}
input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
.
input.setInputType(0);
Bu koddan kaldırdım . Bu bir klavye davranışı ve değiştirilemez inputType
için EditText
.
Buradaki diğer tüm yanıtlar sizin istediğiniz şekilde çalışmazsa, klavyeyi manuel olarak kontrol etmenin başka bir yolu vardır.
Bazı EditText
özelliklerini yönetecek bir işlev oluşturun :
public void setEditTextFocus(boolean isFocused) {
searchEditText.setCursorVisible(isFocused);
searchEditText.setFocusable(isFocused);
searchEditText.setFocusableInTouchMode(isFocused);
if (isFocused) {
searchEditText.requestFocus();
}
}
Ardından, EditText
klavyeyi açtığınızdan / kapattığınızdan emin olun :
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);
}
}
}
});
Şimdi, klavyeyi manuel olarak açmak istediğinizde şunu arayın:
setEditTextFocus(true);
Ve aramayı kapatmak için:
setEditTextFocus(false);
Saurabh Pareek şimdiye kadarki en iyi cevaba sahip.
Yine de doğru bayrakları kullanabilir.
/* 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);
Gerçek kullanım örneği
/* 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 ... */
}
fragment.getActivity().getSystemService();
aradığımdan, burada benim için çalışan bir cevap buldum
// 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);
Sizin de OnClick
dinleyici çağrı onEditorAction
arasında EditText
olanIME_ACTION_DONE
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
}
});
Bu yöntemin Android'in tasarım modeliyle daha iyi, daha basit ve daha uyumlu olduğunu hissediyorum. Yukarıdaki basit örnekte (ve genellikle yaygın vakaların çoğunda) EditText
, odaklanmış / odaklanmış bir tane olacaktır ve genellikle klavyeyi ilk etapta çağıran kişidir (kesinlikle birçoğunda çağırabilir. ortak senaryolar). Aynı şekilde, bu klavyeyi serbest bırakmak için biri olmalıdır, genellikle bu bir yapılabilir ImeAction
. Sadece nasıl bir bakınız EditText
ile android:imeOptions="actionDone"
, aynı yollarla aynı davranışı elde etmek istiyoruz davranır.
Bu ilgili cevabı kontrol et
Bu çalışmalı:
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);
hide()
ve show()
yöntemleri tamamlayabilirsiniz . Benim için çalışıyor, ben de yaptım :) Örneği düzenleyeceğim
KeyBoard.toggle(fragment.getActivity())
Fragment
a yorumundan farklı bir şekilde çağırın . Lütfen yöntemleri nasıl kullanacağınızı öğrenin ve sonra tekrar gelin. İnsanları aptalca cevaplarınızla karıştırıyorsunuz
Bir Hex numarası girmek için özel bir klavye kullanıyorum, bu yüzden IMM klavyesinin görünmesini sağlayamıyorum ...
V3.2.4_r1'de setSoftInputShownOnFocus(boolean show)
, hava durumunu kontrol etmek veya bir TextView odaklandığında klavyeyi görüntülememek için eklendi, ancak hala gizli olduğundan yansıma kullanılmalıdır:
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
}
}
Eski sürümler için, a ile çok iyi sonuçlar aldım (ama mükemmel olmaktan uzak) OnGlobalLayoutListener
, ViewTreeObserver
kök görünümümden bir a yardımı ile ekledim ve sonra klavyenin böyle gösterilip gösterilmediğini kontrol ettim:
@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);
}
}
Bu son çözüm, klavyeyi bir anlığına gösterebilir ve seçim tutamaçlarını karıştırır.
Klavyede tam ekran olduğunda, onGlobalLayout çağrılmaz. Bundan kaçınmak için TextView # setImeOptions (int) veya TextView XML bildiriminde kullanın:
android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"
Güncelleme: Diyalogların klavyeyi asla göstermemek için kullandığı ve tüm sürümlerde çalıştığı bulundu:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
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);
}
}
Ben iş parçacığı yayınlanan tüm çözümler üzerinde çalışmak için iki günden fazla geçirdim ve onları bir şekilde eksik bulundu. Tam gereksinimim,% 100 güvenilirlik ile ekran klavyesini gösterecek veya gizleyecek bir düğmeye sahip olmak. Klavye gizli durumundayken, kullanıcının hangi giriş alanlarını tıklattığına bakılmaksızın yeniden görünmemelidir. Görünür durumundayken, kullanıcının tıkladığı düğmelerden bağımsız olarak klavye kaybolmamalıdır. Bunun en yeni cihazlara kadar Android 2.2 ve üzeri sürümlerde çalışması gerekir.
Benim app temiz RPN bu çalışan bir uygulama görebilirsiniz .
Birkaç farklı telefonda (froyo ve zencefilli cihazlar dahil) önerilen cevapların birçoğunu test ettikten sonra, android uygulamalarının güvenilir bir şekilde yapabileceği ortaya çıktı:
Benim için klavyeyi geçici olarak gizlemek yeterli değil. Bazı cihazlarda, yeni bir metin alanı odaklanır odaklanmaz yeniden görünecektir. Uygulamam bir sayfada birden çok metin alanı kullandığından, yeni bir metin alanına odaklanmak gizli klavyenin tekrar açılmasına neden olur.
Maalesef listedeki 2. ve 3. maddeler yalnızca bir etkinlik başlatıldığında güvenilirlik sağlar. Etkinlik görünür hale geldiğinde klavyeyi kalıcı olarak gizleyemez veya gösteremezsiniz. İşin püf noktası, kullanıcı klavye değiştirme düğmesine bastığında etkinliğinizi yeniden başlatmaktır. Uygulamamda kullanıcı seçim klavyesi düğmesine bastığında, aşağıdaki kod çalışır:
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);
}
}
Bu, geçerli etkinliğin durumunun bir Pakete kaydedilmesine neden olur ve ardından klavyenin gösterilmesi veya gizlenmesi gerektiğini belirten bir boole içinden geçen etkinlik başlatılır.
OnCreate yönteminin içinde aşağıdaki kod çalıştırılır:
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);
}
Yazılım klavyesi gösterilmesi gerekiyorsa, InputMethodManager'a klavyeyi göstermesi söylenir ve pencereye yazılım girişini her zaman görünür yapması söylenir. Yazılım klavyesi gizlenecekse, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM ayarlanır.
Bu yaklaşım, test ettiğim tüm cihazlarda güvenilir bir şekilde çalışır - android 2.2 çalıştıran 4 yaşındaki bir HTC telefondan 4.2.2 çalıştıran bir nexus 7'ye kadar. Bu yaklaşımın tek dezavantajı, geri düğmesini tutarken dikkatli olmanızdır. Benim app aslında sadece bir ekran (onun bir hesap makinesi) olduğu gibi onBackPressed () geçersiz kılabilir ve cihazların ana ekranına dönebilirsiniz.
Tüm bu çözümlere alternatif olarak , klavyeyi açmak için kullanılan (EditText) alanına başvuru yapmadan yumuşak klavyeyi herhangi bir yerden kapatmak istiyorsanız , ancak alan odaklanmışsa yine de yapmak istediyseniz, bu (bir Faaliyetten):
if (getCurrentFocus() != null) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
Sayesinde bu SO cevap , bir ViewPager fragmanları ilerlerken benim durumumda, güzel işleri, aşağıdakileri türetilmiş ...
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);
}
}
Yukarıdaki yanıtlar farklı senaryolar için geçerlidir, ancak klavyeyi bir görünüm içinde gizlemek ve doğru içeriği elde etmek için mücadele etmek istiyorsanız şunu deneyin:
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);
}
}
ve bağlamın yapıcıdan getirilmesi için :)
public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
init();
}
Bir birim veya işlev testi sırasında yazılım klavyesini kapatmak istiyorsanız, testinizdeki "geri düğmesini" tıklatarak bunu yapabilirsiniz:
// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
Yukarıdaki onBackPressed()
söz konusu Faaliyet için tetiklemediğinden, "geri düğmesi" ni tırnak içine aldım . Sadece klavyeyi kapatır.
Devam etmeden önce bir süre duraklattığınızdan emin olun, çünkü geri düğmesinin kapatılması biraz zaman alır, bu nedenle sonraki Görünümler vb. Tıklamaları kısa bir duraklamadan sonra (1 saniye yeterince uzun ime) ).
Android için Mono'da (AKA MonoDroid) bunu nasıl yapacağınız aşağıda açıklanmıştır
InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);
searchbox
Parçacıkta neler var ?
Bu, tüm tuhaf klavye davranışları için benim için çalıştı
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);
}
}
android:windowSoftInputMode="stateHidden"
Manifest dosyasındaki etkinliğinize ekleyin . Misal:
<activity
android:name=".ui.activity.MainActivity"
android:label="@string/mainactivity"
android:windowSoftInputMode="stateHidden"/>
Basit ve kullanımı kolay yöntem, sadece hideKeyboardFrom'u (YourActivity.this) arayın ; klavyeyi gizlemek
/**
* 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);
}
Bu optimize edilmiş kodu etkinliğinizde kullanmanız yeterlidir:
if (this.getCurrentFocus() != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
onTouchListener'ı çağırdıktan sonra:
findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Utils.hideSoftKeyboard(activity);
return false;
}
});
bunu kullan
this.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Benim durumum için, eylem çubuğundaki bir SearchView kullanıyordum. Kullanıcı bir arama yaptıktan sonra klavye tekrar açılır.
InputMethodManager kullanımı klavyeyi kapatmadı. ClearFocus ve arama görünümünün odaklanabilir ayarını false olarak ayarladım:
mSearchView.clearFocus();
mSearchView.setFocusable(false);
clearFocus()
, Android API sayfalarında a içermez , bu yüzden bu benim için işe yaramadı, ancak başka bir çözüm işe yaradı (aşağıdaki cevabıma bakın).
Davam da var, burada EditText
da bir yerde bulunabilir AlertDialog
, böylece klavye kapatıldığında kapatılmalıdır. Aşağıdaki kod herhangi bir yerde çalışıyor gibi görünüyor:
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 );
}
Neredeyse tüm bu cevapları denedim, özellikle samsung galaxy s5 ile ilgili bazı rastgele sorunlar yaşadım.
Sonunda şovu ve gizlemeyi zorlamak ve mükemmel çalışıyor:
/**
* 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);
}