2011-07-13 17 views
32

Sadece "edittext" in dışını tıklatıp odağı otomatik olarak kaybedip klavyeyi gizleyin. Şu anda, "edittext" e tıklarsam odaklanır, ancak odaklanmamam için geri düğmesine basmam gerekiyor.Odağı kaybetmek için edittext öğesine dokunun

+0

İlgili soru: http://stackoverflow.com/q/4165414/782870. Bence cevapların çoğu zaten test edilmiş ve çalışıyormuş. – vida

+0

Bu cevabı buldum: http://stackoverflow.com/a/28939113/2610855 En iyisi. – Loenix

cevap

15

EditText öğenizin Lineer düzende veya diğer ViewGroup'da yerleştirildiğini varsayalım. Sonra bu kabı tıklanabilir, odaklanabilir ve focusableInTouchMode yapmalısınız. onClick geçersiz kılma yöntemi kodu aşağıdaki ile bu kaba o sette OnClickListener sonra:

@Override 
public void onClick(View view) { 
    InputMethodManager imm = (InputMethodManager) view.getContext() 
      .getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
} 
+1

Durumumda, metin alanının odak noktasında sayısal bir klavye gösteriyorum. Çözümünüzü kullanmaya çalıştım. Arka plan görünümüne tıkladığımda, sayısal klavye AlphaNumeric klavyeye dönüşür, sonra tekrar tıkladığımda, kaybolur. –

13

@woodshy klavyeyi gizleme, ama belki onClick kodu koymak için cevabı vardır onFocusChanged koyarak kadar iyi değildir. odak kaybetmek için zorlayarak gelince, onun XML dosyasında, odağı aktarmak istediğiniz nesneyi ayarlamak gerekir:

Ben herhangi bir yere dokunun kez klavyeyi gizlemek zorunda gibi aynı gereksinimi vardı
android:focusable="true" 
android:focusableInTouchMode ="true" 
+0

Bu konuyla ilgili bir sorum olabilir mi? Bu kodun LinearLayout'a mı yoksa odaklanmak istemediğim EditText'e mi yerleştirilmesi gerektiği anlamına mı geliyorsunuz? Teşekkürler. – detno29

+0

Bunu, ana görünümün özniteliği olarak atamanız gerekir (etkinliğinizin içerik görünümü). Bunu kontrol etmek isteyebilirsiniz: http://stackoverflow.com/a/19828165/782870 – vida

-5

EditText kutumun dışında. setOnFocusChangeListener, işi düzenleme metin kutusunun dışına dokunmuş olsanız bile işi yapmaz.

Bunun için edc598 here çözümünü kullandım.

  • Önce tüm görünümü içeren MainLayout'u aldım ve ona dokunma dinleyicisi ekledim.
  • OnTouch olayı tetiklendiğinde EditText kutusunun odaklanıp odaklanmadığını kontrol ediyorum.
  • EditText kutusunda odak varsa, olayın X-Y koordinatlarını kontrol ederim. Benim EditText kutusunun yerleştirilmesi dayanarak
  • Ben

kod örneği here değiştirilmiş kutusunun dışında herhangi bir dokunsam anahtar kurulu gizlemek:

LinearLayout MainLayout = (LinearLayout) findViewById(R.id.MainLayout); 
EditText textBox  = (EditText) findViewById(R.id.textBox); 
int X_TOP_LEFT  = 157; 
int Y_TOP_LEFT  = 388; 
int X_BOTTOM_RIGHT = 473; 
int Y_BOTTOM_RIGHT = 570; 
MainLayout.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     // TODO Auto-generated method stub 
     if(textBox.isFocused()){ 

      Log.i("Focussed", "--" + event.getX() + " : " + event.getY() + "--"); 

      if(event.getX() <= 157 || event.getY() <= 388 || event.getX() >= 473 || event.getY() >= 569){ 
       //Will only enter this if the EditText already has focus 
       //And if a touch event happens outside of the EditText 
       textBox.clearFocus(); 
       InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 
       //Do something else 
      } 
     } 
     Log.i("X-Y coordinate", "--" + event.getX() + " : " + event.getY() + "--"); 
    //Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show(); 
     return false; 
    } 
}); 
+32

dostum, bu sihirli sayılarla bize şaka yapıyor olmalısın ... –

+0

EditText'i yiyeceğinden beri sınırları kontrol etmene gerek yok dokunma olayları. – pstoppani

1

yüzden etrafta biraz aradı ve başka hiçbir çözüm tam olarak aradığım şey değildi. Benim düşünceme göre, odak EditText görünümlerinde garip davranıyor. Ben ne yaptık

...

  1. kök görünümü RelativeLayout

  2. klavye yok yapmak alanın ÜZERİNDEN olan bir bindirme düzeni Ekle olduğundan emin olun, ancak Metni düzenle. Bir şey gibi aşağıda: Benim durumumda

, EditText ekranının altındaki bir kap içinde oldu. bu yüzden her şeyi örtbas etti.

  1. bunun gibi biraz görünüyor bir yöntem var:
 
    private void hideKeyboard() { 
     final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); 
     keyboardOverlay.setVisibility(View.GONE); 
     editText.clearFocus(); 
    } 
  1. Şimdi onClick bu yöntemi çağırmak oluşturduğunuz kaplamanın.

  2. Şimdi istediğimiz, editText'e bastığınızda görüntünün görünmesini sağlamak. OnFocus olayını kullanamazsınız (en azından bunu işe almadım ...) Bu yüzden, on-on yerine, onTouch olayını yönetdim. Burada

 
editText.setOnTouchListener(new OnTouchListener() { 

    @Override 
    public boolean onTouch(final View v, final MotionEvent event) { 
     keyboardOverlay.setVisibility(View.VISIBLE); 
     editText.requestFocus(); 
     return false; 
    } 
}); 

requestFocus() onTouch ile odak olayı geçersiz getirmemektir.

Hızlı öneride, bunu denediğinizde, tam olarak ne olduğunu görmek için bindirmeye arka plan rengi ekleyebilirsiniz.

Umut sizin için çalışıyor!

+0

bunu yapmak için daha iyi bir yol var mı? – Gohan

11

yapmanız gerekenleri Bu sorunu çözmek için bu EditText ilk kullanımı setOnFocusChangeListener olan

edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if (!hasFocus) { 
        Log.d("focus", "focus loosed"); 
        // Do whatever you want here 
       } else { 
        Log.d("focus", "focused"); 
       } 
      } 
     }); 

ve sonra EditText kodunun altına gördükleri içeren aktivitesinde dispatchTouchEvent geçersiz yapmanız gerekenler

@Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      View v = getCurrentFocus(); 
      if (v instanceof EditText) { 
       Rect outRect = new Rect(); 
       v.getGlobalVisibleRect(outRect); 
       if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) { 
        Log.d("focus", "touchevent"); 
        v.clearFocus(); 
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 
       } 
      } 
     } 
     return super.dispatchTouchEvent(event); 
    } 

Şimdi ne olacak bir kullanıcı dışarıda tıkladığında önce o zaman bu dispatchTouchEvent çağrılacak ve daha sonra odağı düzenledikten sonra şimdi OnFocusChangeListener odağınız değişmiş olarak çağrılacaktır. Yapmak istediğin her şeyi yapabilirsin, umarım işe yarar. :)

+0

Bu yöntemi beğendim. Ayrıca, editText'in doğrudan üst öğesinin düzeninde 'android: focusable =" true "ve android: focusableInTouchMode =" true "seçeneklerini ekleyin. –

+0

'odakta bırakılan odak,' odaklanmalı 'olmalıdır :)) – Stack

0

Aşağıdaki kod benim için mükemmel bir şekilde çalışıyor ve düzenli olarak bunu, EditText'in dışındaki herhangi bir yerde SoftKeyboard onTouch'u kapatmak için için kullanıyorum.

public void hideSoftKeyboard() { //Hides the SoftKeyboard InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0); } public void setupUI(View view) { String s = "inside"; //Set up touch listener for non-text box views to hide keyboard. if (!(view instanceof EditText)) { view.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { hideSoftKeyboard(); return false; } }); } //If a layout container, iterate over children and seed recursion. if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { View innerView = ((ViewGroup) view).getChildAt(i); setupUI(innerView); } } } 

Yani sadece onCreate() yöntem ve voilla kez setupUI() fonksiyon çağırmak zorunda senin hidingSoftKeyboard kurulumdur!

için EditText öğesinin tam olarak odaklanmasını kaybederek, hideSoftKeyboard() işlevinde editText.clearFocus() yapın.

0

Aşağıdaki adımları yaparak bunu başarabilirsiniz: Aşağıdaki ekleyerek tıklanabilir ve odaklanabilir ebeveyn görüntüsü 1.Make

(etkinlik içerik görünümü)

android:clickable="true" 
    android:focusableInTouchMode="true" 

2.Implement a bağlıyor hideKeyboard() yöntemi

public void hideKeyboard(View view) { 
     InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE); 
     inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); 
    } 

3.Lastly, senin EDITTEXT ait onFocusChangeListener ayarlayın.

edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       hideKeyboard(v); 
      } 
     } 
    });