Düğmeye basıldığında sanal klavyeyi kapatın


133

Bir Activityile bir EditText, bir düğme ve bir var ListView. Amaç, bir arama ekranı yazmaktır.EditText , düğmesine basmak ve arama sonuçlarının bu listeyi doldurmasını sağlamaktır.

Bunların hepsi mükemmel çalışıyor, ancak sanal klavye garip davranıyor.

Tıklarsam EditTextsanal klavyeyi alırım. Sanal klavyede "Bitti" düğmesine tıklarsam kaybolur. Ancak, sanal klavyede "Bitti" yi tıklamadan önce arama düğmesine tıklarsam, sanal klavye kalıyor ve ondan kurtulamıyorum. "Bitti" düğmesine tıklamak klavyeyi kapatmaz. "Bitti" düğmesini "Bitti" den bir oka dönüştürür ve görünür durumda kalır.

Yardımınız için teşekkürler

Yanıtlar:


304
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

Bunu onClick(View v)olaydan hemen sonra koydum .

İçe aktarmanız gerekiyor android.view.inputmethod.InputMethodManager;

Düğmeye tıkladığınızda klavye gizlenir.


55
Not: (bu yöntemi odaklanmanın olmadığı durumlarda kullanmak istemeniz durumunda (örneğin, Duraklat (), vb.): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai

5
Ayrıca Bağlamı içe aktarmanız gerekir.
Si8

4
DİKKAT: Klavye zaten gizlenmişse NPE atar. Bundan kaçınmak için Peter'ın yorumunu takip edin.
Don Larynx

neden alakasız bir düğmeye tıklandıktan sonra klavye görünüyor? birisi açıklama veya bağlantı sağlayabilir mi?
kommradHomer

1
Cazibe gibi çalışıyor!
ARiF

59
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});

Benim için çalışıyor. Teşekkürler!
Aman Goyal

29

Aşağıdaki Kodu Kullanın

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});

2
Basit boş kontrol yerine istisna yakalamak, cidden mi ?!
Dr Glass

Benim için çalışıyor, düğme tıklandığında klavyeyi gizler
ashishdhiman2007

ihtiyacım olan şey için basit bir çözüm: arama düğmesini tıkladıktan sonra klavyeyi gizleyin.
dawoodman71

13

OnEditorActionListenerEditView için uygulamanız gerekir

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

Ve klavyeyi şu şekilde gizlersiniz:

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

Ayrıca düğmenizde klavye gizleme özelliğini kullanarak ateşlemelisiniz. onClickListener

Şimdi sanal klavyede 'Bitti'ye tıklamak ve düğme aynı şeyi yapacaktır - klavyeyi gizleyin ve tıklama eylemi gerçekleştirin.


Mükemmel, ama pek takip etmiyorum. Yazının kodun bir kısmını yediğini düşünüyorum (örneğinizde "genel boşluktan" sonra hiçbir şey yok). Activity'in onCreate yönteminde setOnEditorActionListner'ı ayarlamaya çalıştım, ancak setOnEditorActionListener'ın ne olduğunu bilmiyor. "Anonim iç tip" bildirimi alıyorum. (Bunu Activity onCreate yöntemimde yapıyorum) i37.tinypic.com/6ozkig.png
Andrew

1
Görünüşe göre bu kodda birkaç hata var, ama bu doğru fikir. İlk olarak, OnEditorActionListener arabirimi bir iç sınıftır, bu nedenle ya açıkça içe aktarmanız gerekir (bu durumda Eclipse bunu sizin için yapmaz) ya da TextView.OnEditorActionListener.
MatrixFrog 04

Biraz sorun yaşıyorum. OnEditorActionListener'ı uyguladım (genel sınıf SearchActivity, ListActivity uygulamalarını OnClickListener, OnEditorActionListener'ı genişletir), EditText'ime bir dinleyici ekledim (mSearchText.setOnEditorActionListener (this);), ancak Eclipse (public class onEditor (TextView v, int actionId, KeyEvent olayı)). Bir üst sınıf yöntemini geçersiz kılması gerektiğini söylüyor. Herhangi bir fikir?
Andrew

Merhaba, onEditorActionListener'ınızıEditView.setOnEditorActionListener (yeni OnEditorActionListener () {....
pixel

11

Düğme tıklama etkinliğinize aşağıdaki kodu ekleyin:

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

1
Cazibe gibi çalışıyor!
coderpc

10

Yalnızca bir düzenleme metniniz olduğundan, düğmenizin içindeki düzenleme metni için yalnızca çağrı eylemi yapılır ve geri kalanı sistem tarafından işlenir. Birden fazla edittext'iniz varsa, bu o kadar etkili olmazdı çünkü önce odaklanmış edittext'i almanız gerekir. Ama senin durumunda mükemmel çalışacak

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
Başkalarının anlayabilmesi ve ondan öğrenebilmesi için çözümünüzün neden işe yaradığına dair bir açıklama bırakabilir misiniz? Teşekkürler!
Shawn

Tabii Shawn. Poz verme konusunda yeniyim, eğer net değilse bana haber verin ve onclick düğmesiyle genişleteceğim
Laert

İnanın bana, bunu yapmanın en zarif yollarından biri bu. Teşekkürler @Laert
WitVault

9

Aktivite için,

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

Parçalar için getActivity () kullanın

. GetActivity () getSystemService ();

. GetActivity () getCurrentFocus ();

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

7

Bu çözüm benim için mükemmel çalışıyor:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

3

Bunu dene...

  1. Klavyeyi göstermek için

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. Klavyeyi gizlemek için

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

"Klavyeyi gizlemek için" yöntemi bir toogle (görünürse gizle, gizliyse göster) bir gizleme değil
Ninja Coding

1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}

Selam! Bu cevap @Andrew'in ihtiyaçlarını karşılasa da, bir açıklama ile genişletebilirseniz, gelecekteki okuyucuların tam anlamıyla fayda sağlayacağından emin olmak harika olurdu!
derM

1

Kotlin örneği:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

Parçadan:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

Faaliyetten:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

0

Bu kodu düğme tıklama etkinliğinizde kullanırsınız

// 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);
}

0

Crash Null Point Exception Fix: Kullanıcı düğmeyi tıkladığında klavyenin açılmayabileceği bir durum vardı. GetCurrentFocus () 'un null olmadığını kontrol etmek için bir if ifadesi yazmanız gerekir:

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

-2

Ayarladıysanız android:singleLine="true", düğme otomatik olarak klavyeyi gizler

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.