Android Soft Keyboard'u kapat─▒n / gizleyin


Al─▒nan cevaba git


D├╝zenimde bir EditText ve bir var Button .

D├╝zenleme alan─▒na yazd─▒ktan ve ├╝zerine t─▒klad─▒ktan Button sonra sanal klavyeyi gizlemek istiyorum. Bunun basit bir kod par├žas─▒ oldu─čunu varsay─▒yorum, ancak bunun bir ├Ârne─čini nereden bulabilirim?


3606









Cevap say─▒s─▒n─▒ say: 30






Bu delili─či a├ž─▒kl─▒─ča kavu┼čturmak i├žin, GoogleÔÇÖ─▒n yaz─▒l─▒m klavyesindeki d├╝ped├╝z sa├žma davran─▒┼č─▒ i├žin t├╝m Android kullan─▒c─▒lar─▒ ad─▒na ├Âz├╝r dileyerek ba┼člamak istiyorum. Bunun nedeni, her biri farkl─▒, ayn─▒ basit soru i├žin farkl─▒ cevaplar olmas─▒n─▒n nedeni, bu API, Android'deki di─čerleri gibi, korkun├ž bir ┼čekilde tasarlanm─▒┼č. Bunu s├Âylemenin kibar bir yolu olmad─▒─č─▒n─▒ d├╝┼č├╝nebilirim.

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 klavyedeki API'si. FAKAT! Bir sahip olmalar─▒ gerekmektedir Context IMM eri┼čmek i├žin s─▒ras─▒n─▒. ┼×imdi bir sorunumuz var. Klavyeyi, kullan─▒m─▒ veya ihtiyac─▒ olmayan statik veya yard─▒mc─▒ bir s─▒n─▒ftan gizlemek isteyebilirim Context . veya Ve FAR daha da k├Ât├╝s├╝, IMM klavyeyi FROM'dan gizlemek istedi─činizi View (hatta daha k├Ât├╝s├╝n├╝ Window ) belirtmenizi gerektirir .

Klavyeyi gizlemeyi bu kadar zorla┼čt─▒ran ┼čey budur. Sevgili Google: Bir kek tarifi ararken RecipeProvider , D├╝nya'da kim taraf─▒ndan ilk kez cevaplanmad─▒─č─▒ ve kekin nerede yenece─či ve nerede yenilece─či konusunda bana cevap vermeyi reddedecek hi├žbir ┼čey yok !!

Bu ├╝z├╝c├╝ hikaye ├žirkin ger├že─či ile bitiyor: Android klavyesini gizlemek i├žin, 2 tip kimlik tan─▒mlaman─▒z gerekecek: a Context ve a View veya a Window .

Ben bir ├žok denemek ┼čart─▒yla, ├çOK kat─▒ bir ┼čekilde i┼č yapabilecek statik bir yard─▒mc─▒ program 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─▒ program─▒n SADECE bir Activity ! Den ├ža─čr─▒ld─▒─č─▒nda i┼če yarad─▒─č─▒n─▒ unutmay─▒n . Yukar─▒daki y├Ântem , uygun pencere belirtecini almak i├žin getCurrentFocus hedefi ├ža─č─▒r─▒r Activity .

Ama bir klavyeyi gizlemek istedi─činiz varsayal─▒m EditText bir bar─▒nd─▒r─▒lan DialogFragment ? Bunun i├žin yukar─▒daki y├Ântemi kullanamazs─▒n─▒z:

 hideKeyboard(getActivity()); //won't work
 

Bu i┼če yaramayacak, ├ž├╝nk├╝ g├Âsterilen Fragment ana makineye Activity odaklanm─▒┼č kontrole sahip olmayacak bir referans g├Ândereceksiniz Fragment ! Vaov! Bu nedenle, klavyeyi par├žalardan gizlemek i├žin daha d├╝┼č├╝k seviyeli, daha yayg─▒n ve ├žirkinlere 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├╝ takip ederek bo┼ča harcanan zamandan toplanan baz─▒ ek bilgiler verilmi┼čtir:

WindowSoftInputMode hakk─▒nda

Dikkat edilmesi gereken ba┼čka bir ├žeki┼čme noktas─▒ var. Varsay─▒lan olarak, Android otomatik olarak ba┼člang─▒├žtaki oda─č─▒, i├žindeki ilk EditText ya da odaklanabilir kontrole atayacakt─▒r Activity . Do─čal olarak, InputMethod'un (tipik olarak yumu┼čak klavyenin) focus olay─▒na kendini g├Âstererek yan─▒t verece─či sonucu ├ž─▒kar. ─░├žindeki windowSoftInputMode ├Âznitelik AndroidManifest.xml , ayarland─▒─č─▒nda stateAlwaysHidden , klavyeye otomatik olarak atanan bu ilk oda─č─▒ yoksaymas─▒n─▒ s├Âyler.

 <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 (kontrole focusable="false" ve / veya focusableInTouchMode="false" atanmam─▒┼čsa). G├Âr├╝n├╝┼če g├Âre, windowSoftInputMode ayar─▒, dokunma olaylar─▒ taraf─▒ndan tetiklenen olaylara odaklanma yerine, yaln─▒zca otomatik odak olaylar─▒na uygulan─▒r.

Bu nedenle, stateAlwaysHidden ger├žekten ├žok k├Ât├╝ bir ┼čekilde adland─▒r─▒lm─▒┼čt─▒r. Bunun ignoreInitialFocus yerine belki de ├ža─čr─▒lmal─▒d─▒r .

Bu yard─▒mc─▒ olur umar─▒m.


G├ťNCELLEME: Pencere belirteci alman─▒n daha fazla yolu

Odaklanm─▒┼č bir g├Âr├╝n├╝m yoksa (├Ârne─čin, par├žalar─▒ yeni de─či┼čtirdiyseniz ger├žekle┼čebilir), yararl─▒ bir pencere belirteci sa─člayacak ba┼čka g├Âr├╝┼čler de vard─▒r.

Bunlar yukar─▒daki kodun alternatifidir if (view == null) view = new View(activity); Bunlar a├ž─▒k├ža faaliyetinize at─▒fta bulunmaz.

Bir fragman s─▒n─▒f─▒n─▒n i├žinde:

 view = getView().getRootView().getWindowToken();
 

fragment Parametre olarak bir fragman verildi :

 view = fragment.getView().getRootView().getWindowToken();
 

─░├žerik g├Âvdesinden ba┼člayarak:

 view = findViewById(android.R.id.content).getRootView().getWindowToken();
 

G├ťNCELLEME 2: Uygulamay─▒ arka plandan a├žarsan─▒z klavyeyi tekrar g├Âstermemek i├žin netlemeyi temizleyin

Bu sat─▒r─▒, y├Ântemin sonuna ekleyin:

view.clearFocus();


1746







Android'i sanal klavyeyi gizlemek i├žin, InputMethodManager kullanarak , ├ža─čr─▒ yaparak hideSoftInputFromWindow , odaklanm─▒┼č g├Âr├╝n├╝m├╝n├╝z├╝ i├žeren pencerenin belirtecinden ge├žirerek zorlayabilirsiniz .

 // 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 zorlar. Baz─▒ durumlarda, InputMethodManager.HIDE_IMPLICIT_ONLY yaln─▒zca klavyeyi gizlemek i├žin, kullan─▒c─▒ a├ž─▒k├ža g├Âr├╝nt├╝lenmeye zorlamad─▒─č─▒nda (men├╝y├╝ bas─▒l─▒ tutarak) ikinci parametre olarak ge├žmek isteyebilirsiniz .

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

4357







Yumu┼čak klavyeyi 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 de─čene kadar yaz─▒l─▒m klavyesini bast─▒rmak i├žin kullan─▒labilir.


789







Klavyeyi gizlemek i├žin bir ├ž├Âz├╝m daha buldum:

 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 kapat─▒r.


331







Meier'in ├ž├Âz├╝m├╝ de benim i├žin ├žal─▒┼č─▒yor. Benim durumumda benim App ├╝st d├╝zey bir tabHost ve sekmeleri de─či┼čtirirken anahtar s├Âzc├╝─č├╝ gizlemek istiyorum - Ben pencere belirteci tabHost g├Âr├╝n├╝m├╝nden al─▒yorum.

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

145







L├╝tfen bunu a┼ča─č─▒daki kodu deneyin onCreate()

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

134







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

125







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

84







Buradaki t├╝m di─čer cevaplar sizin istedi─činiz gibi ├žal─▒┼čmazsa, klavyeyi manuel olarak kontrol etmenin ba┼čka bir yolu vard─▒r.

Baz─▒ EditText ├Âzelliklerin y├Ânetilece─či 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, oda─č─▒n EditText Klavyeyi a├ž─▒p kapatt─▒─č─▒ndan 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, ne zaman klavyeyi elle a├žmak istedi─činizde aray─▒n:

 setEditTextFocus(true);
 

Ve ├ža─čr─▒y─▒ kapatmak i├žin:

 setEditTextFocus(false);
 

68







Saurabh Pareek ┼ču ana kadarki en iyi cevaba sahip.

Yine de do─čru bayraklar─▒ kullanabilirsin.

 /* 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 ... */
}
 

59







bu y├╝zden, burada benim i├žin i┼če yarayan 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);
 

54







K─▒sa cevap

Sizin de OnClick dinleyici ├ža─čr─▒ onEditorAction aras─▒nda EditText olan IME_ACTION_DONE

 button.setOnClickListener(new OnClickListener() {

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

Detayland─▒rma

Android'in tasar─▒m deseni ile daha iyi, daha basit ve daha uyumlu oldu─čunu d├╝┼č├╝n├╝yorum. Yukar─▒daki basit ├Ârnekte (ve genellikle yayg─▒n vakalar─▒n ├žo─čunda) EditText odaklanacak / odaklanacak bir ┼čey elde edersiniz ve genellikle klavyeyi ilk etapta ├ža─č─▒ran ki┼či de olurdu (kesinlikle bir├žok yerde ├ž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 ethttps://stackoverflow.com/a/3449616/2837443


51







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

46







Hex numaras─▒ girmek i├žin ├Âzel bir klavye kullan─▒yorum, bu y├╝zden IMM klavyesini g├Âsteremiyorum ...

V3.2.4_r1'de setSoftInputShownOnFocus(boolean show) hava durumunu kontrol etmek veya bir TextView odakland─▒─č─▒nda klavyeyi g├Âr├╝nt├╝lemek i├žin eklenmemek i├žin eklendi, ancak yine de 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
    }
}
 

Daha eski s├╝r├╝mler i├žin, a ile ├žok iyi sonu├žlar elde ettim (ancak m├╝kemmel olmaktan uzak) OnGlobalLayoutListener , ViewTreeObserver k├Âk g├Âr├╝n├╝m├╝mden a yard─▒m─▒yla ekledim ve klavyenin bu ┼čekilde g├Âsterilip g├Âsterilmedi─čini kontrol ettik :

 @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, bir saniye boyunca klavyeyi g├Âsterebilir ve se├žim tutama├žlar─▒yla kar─▒┼čabilir.

Klavyede tam ekrana girdi─činde, onGlobalLayout ├ža─čr─▒lmaz. Bunu ├Ânlemek i├žin, TextView # setImeOptions (int) ├Â─česini veya TextView XML bildiriminde kullan─▒n:

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

G├╝ncelleme: Klavyenin hi├žbir zaman g├Âsterilmemesi i├žin hangi ileti┼čim kutular─▒n─▒n kullan─▒ld─▒─č─▒n─▒ ve t├╝m s├╝r├╝mlerde ├žal─▒┼čt─▒─č─▒n─▒ ├Â─črendim:

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

43







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

33







─░ki g├╝nden uzun bir s├╝redir ipli─če g├Ânderilen t├╝m ├ž├Âz├╝mler boyunca ├žal─▒┼čarak bunlar─▒ bir ┼čekilde veya ba┼čka bir ┼čekilde eksik buldum. As─▒l ihtiyac─▒m,% 100 g├╝venilirli─če sahip bir tu┼čun ekran klavyesini g├Âsterip gizlemesini sa─člamak. Klavye gizli durumdayken, kullan─▒c─▒n─▒n hangi giri┼č alan─▒n─▒ t─▒klatt─▒─č─▒na bakmaks─▒z─▒n yeniden g├Âr├╝nmemesi gerekir. G├Âr├╝n├╝r durumdayken, kullan─▒c─▒n─▒n hangi d├╝─čmeyi t─▒klatt─▒─č─▒na bakmaks─▒z─▒n klavye kaybolmamal─▒d─▒r. Bunun en son cihazlara kadar Android 2.2+ ├╝zerinde ├žal─▒┼čmas─▒ gerekiyor.

Bunun ├žal─▒┼čan bir uygulamas─▒n─▒, temiz RPN uygulamamda g├Ârebilirsiniz .

├ľnerilen cevaplar─▒n bir├žo─čunu farkl─▒ telefonlarda (froyo ve gingerbread cihazlar─▒ dahil) test ettikten sonra, android uygulamalar─▒n─▒n g├╝venilir bir ┼čekilde yapabilece─či anla┼č─▒ld─▒:

  1. Klavyeyi ge├žici olarak gizleyin. Bir kullan─▒c─▒ yeni bir metin alan─▒na odakland─▒─č─▒nda tekrar g├Âr├╝necektir.
  2. Bir etkinlik ba┼člad─▒─č─▒nda klavyeyi g├Âsterin ve etkinli─če klavyenin her zaman g├Âr├╝n├╝r olmas─▒ gerekti─čini belirten bir bayrak koyun. Bu bayrak sadece bir aktivite ba┼člat─▒ld─▒─č─▒nda belirlenebilir.
  3. Klavyenin kullan─▒m─▒n─▒ hi├žbir zaman g├Âstermemek veya izin vermemek i├žin bir etkinli─či i┼čaretleyin. Bu bayrak sadece bir aktivite ba┼člat─▒ld─▒─č─▒nda belirlenebilir.

Benim i├žin klavyeyi ge├žici olarak gizlemek yeterli de─čil. Baz─▒ cihazlarda, yeni bir metin alan─▒ odakland─▒─č─▒ anda yeniden g├Âr├╝necektir. Uygulamam bir sayfada birden fazla metin alan─▒ kulland─▒─č─▒ndan, yeni bir metin alan─▒na odaklanmak gizli klavyenin tekrar a├ž─▒lmas─▒n─▒ sa─člar.

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 ge├ži┼č d├╝─čmesine bast─▒─č─▒nda etkinli─činizi yeniden ba┼člatmakt─▒r. Uygulamamda, kullan─▒c─▒ ge├ži┼č klavyesi d├╝─čmesine bast─▒─č─▒nda, a┼ča─č─▒daki kod ├žal─▒┼čt─▒r─▒l─▒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, mevcut etkinli─čin durumunun bir Bundle'a kaydedilmesini sa─člar ve ard─▒ndan klavyenin g├Âsterilip g├Âsterilmeyece─čini veya gizlenece─čini belirten bir boolenden 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┼činin her zaman g├Âr├╝n├╝r olmas─▒n─▒ sa─člama talimat─▒ verilir. Yaz─▒l─▒m klavyesinin gizlenmesi gerekiyorsa, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM ayarlan─▒r.

Bu yakla┼č─▒m test etti─čim t├╝m cihazlarda g├╝venilir bir ┼čekilde ├žal─▒┼č─▒yor - 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 kullan─▒rken dikkatli olman─▒z gerekti─čidir. Uygulamam─▒n esas olarak yaln─▒zca bir ekran─▒ (bir hesap makinesi) oldu─čundan onBackPressed () i┼člevini ge├žersiz k─▒labilir ve cihazlar─▒n ana ekran─▒na geri d├Ânebilirim.


30







Alternatif olarak, bu ├ž├Âz├╝m ├ževresinde , klavyeyi a├žmak i├žin kullan─▒lan (EditText) alan─▒na referans vermeden yumu┼čak klavyeyi herhangi bir yerden kapatmak istiyorsan─▒z , ancak yine de alan odaklanm─▒┼čsa bunu yapmak i├žin kullanabilirsiniz. bu (bir Aktiviteden):

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

27







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

25







Cevaplar yukar─▒da farkl─▒ senaryolar i├žin i┼če yarar ancak klavyeyi bir g├Âr├╝n├╝m├╝n i├žine gizlemek ve do─čru i├žeri─či elde etmek i├žin u─čra┼čmak 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─▒ kurucudan almak i├žin :)

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

21







Bir birimi veya i┼člevsel testi s─▒ras─▒nda yaz─▒l─▒m klavyesini kapatmak istiyorsan─▒z, testinizden "geri" d├╝─čmesini t─▒klatarak yapabilirsiniz:

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

Yukar─▒daki "Geri d├╝─čmesini" t─▒rnak i├žine ald─▒m, ├ž├╝nk├╝ yukar─▒daki onBackPressed() s├Âz konusu Aktivite i├žin tetikleyici de─čildir . Sadece klavyeyi kapat─▒r.

Devam etmeden ├Ânce bir s├╝re duraklatt─▒─č─▒n─▒zdan emin olun, ├ž├╝nk├╝ geri d├╝─čmesini kapatmak biraz zaman al─▒r, bu nedenle daha sonra G├Âr├╝n├╝mler vb. T─▒klamalar k─▒sa bir duraklamadan sonraya kadar kaydedilmez (1 saniye yeterince uzun ).


18







─░┼čte Android i├žin Mono'da nas─▒l yapt─▒─č─▒n─▒z (AKA MonoDroid)

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

15







Bu benim i├žin tuhaf klavye davran─▒┼člar─▒ i├žin i┼če yarad─▒.

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

15







android:windowSoftInputMode="stateHidden" Manifest dosyas─▒ndaki etkinli─činize ekleyin . ├ľrnek:

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

14







Basit ve kullan─▒m─▒ kolay bir y├Ântemdir, sadece hideKeyboardFrom (YourActivity.this); klavyeyi gizlemek i├žin

 /**
 * 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







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

onTouchListener'daki bu ├ža─čr─▒dan sonra:

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

12







bunu kullan

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

12







Benim durumumda, eylem ├žubu─čundaki bir SearchView kullan─▒yordum. Bir kullan─▒c─▒ bir arama yapt─▒ktan sonra, klavye tekrar a├ž─▒l─▒r.

InputMethodManager kullanarak klavyeyi kapatmad─▒. Oda─č─▒ temizlemek ve arama g├Âr├╝n├╝m├╝n├╝n oda─č─▒n─▒ yanl─▒┼č de─čerine ayarlamak zorunda kald─▒m:

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

12







Faaliyetinizde sadece bu optimize edilmi┼č kodu kullan─▒n:

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

12







Davam─▒ var EditText bir de bulunabilir AlertDialog klavye g├Ârevden kapat─▒lm─▒┼č olmal─▒d─▒r, b├Âylece. 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 );
}
 

12







Neredeyse t├╝m bu cevaplar─▒ denedim, ├Âzellikle samsung galaxy s5 ile ilgili baz─▒ rastgele sorunlar ya┼čad─▒m.

Sonunda ┼čovum ve gizlemeye zorluyorum 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);
}
 

12



─░lgili yay─▒nlar


EditText'in d─▒┼č─▒n─▒ t─▒klad─▒ktan sonra android'de yumu┼čak klavyeyi nas─▒l gizleyebilirim?

Programl─▒ olarak Android Yumu┼čak Klavyeyi Gizle / G├Âster [├žo─čalt]

Android yumu┼čak klavye edittext alan─▒n─▒ kapsar

Etkinlik ba┼člad─▒─č─▒nda Yumu┼čak Klavye nas─▒l gizlenir

Yumu┼čak klavye, Android'deki bir etkinlikte dinleyiciyi a├ž─▒p kapat─▒r

Android i├žin yumu┼čak bir klavye nas─▒l geli┼čtirilir? [kapal─▒]

Android em├╝lat├Âr├╝n├╝n yumu┼čak klavyeyi g├Âstermesini nas─▒l sa─člayabilirim?

Yumu┼čak klavye android g├Âsterildi─činde d├╝zeni yukar─▒ ta┼č─▒mak

Yumu┼čak klavyeyi bir par├žan─▒n i├žinden nas─▒l gizlerim?

Android Soft KeyBoard programl─▒ olarak nas─▒l kapat─▒l─▒r?

Etiketle ilgili di─čer sorular [android]


Bir s├Âzl├╝kte yineleme yapman─▒n en iyi yolu nedir?

Java S─▒n─▒f─▒nda kanonik ad, basit ad ve s─▒n─▒f ad─▒ aras─▒ndaki fark nedir?

Medya sorgular─▒nda ÔÇťekranÔÇŁ ve ÔÇťsadece ekranÔÇŁ aras─▒ndaki fark nedir?

De─či┼čiklikleri kaybetmeden en son ihanet edilmeyen git ifa i┼člemine nas─▒l karar verilmez?

Linux'ta bir dosyay─▒ kabuktan di─čerine nas─▒l ekleyebilirim?

Yabanc─▒ anahtarlar─▒ g├Ârmezden MySQL DROP t├╝m tablolar

Asal olup olmad─▒─č─▒n─▒ belirlemek i├žin neden asal say─▒n─▒n karek├Âk├╝n├╝ kontrol ediyoruz?

0 ondal─▒k de─či┼čmez mi yoksa sekizli de─či┼čmez mi?

UNIX pwd'ye e┼čde─čer Windows

SSL / TLS g├╝venli kanal─▒ i├žin g├╝ven ili┼čkisi kurulamad─▒ - SOAP