2011-07-13 17 views
32

खोने के लिए बाहरी संपादन को टैप करें, मैं केवल "edittext" के बाहर क्लिक करना चाहता हूं ताकि स्वचालित रूप से फोकस खो जाए और कीबोर्ड छुपा सकें। फिलहाल, यदि मैं "edittext" पर क्लिक करता हूं तो यह फ़ोकस करता है लेकिन मुझे बैक बटन को फ़ोकस करने की आवश्यकता होती है।फोकस

+0

संबंधित प्रश्न: http://stackoverflow.com/q/4165414/782870। मुझे लगता है कि ज्यादातर उत्तरों का परीक्षण पहले से ही किया जा चुका है और काम करने के लिए पाया गया है। – vida

+0

मुझे यह जवाब मिला: http://stackoverflow.com/a/28939113/2610855 सबसे अच्छा। – Loenix

उत्तर

15

मान लीजिए कि आपका संपादन टेक्स्ट रैखिक लेआउट या अन्य व्यू ग्रुप पर रखा गया है। फिर आपको इस कंटेनर को क्लिक करने योग्य, फोकस करने योग्य और फोकस करने योग्य इंटचोडोड बनाना चाहिए। onClick अवहेलना विधि में कोड निम्नलिखित के साथ है कि सेट onClickListener इस कंटेनर में करने के बाद:

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

मेरे मामले में, मैं टेक्स्ट फ़ील्ड के फ़ोकस पर एक संख्यात्मक कीबोर्ड दिखा रहा हूं। मैंने आपके समाधान का उपयोग करने की कोशिश की। जब मैं पृष्ठभूमि दृश्य पर क्लिक करता हूं, तो संख्यात्मक कीबोर्ड अल्फा न्यूमेरिक कीबोर्ड में परिवर्तित होता है, फिर जब मैं दोबारा क्लिक करता हूं, तो यह गायब हो जाता है। –

13

@woodshy कुंजीपटल छुपा, लेकिन शायद onClick में कोड डालने के लिए इस सवाल का जवाब है onFocusChanged में डालने के रूप में के रूप में अच्छा नहीं है। मजबूर फोकस कम करने के लिए के रूप में, आप वस्तु निर्धारित करने की आवश्यकता आप को फोकस हस्तांतरण करने के लिए अपने एक्सएमएल फ़ाइल में हैं:

android:focusable="true" 
android:focusableInTouchMode ="true" 
+0

क्या मेरे पास इस से संबंधित कोई प्रश्न हो सकता है: आपका मतलब है कि इन कोडों को LinearLayout, या EditText में रखा जाना चाहिए जिसे मैं निरस्त करना चाहता हूं? धन्यवाद। – detno29

+0

आपको इसे मूल दृश्य (आपकी गतिविधि के सामग्री दृश्य) के गुण के रूप में रखना चाहिए। आप इसे देखना चाह सकते हैं: http://stackoverflow.com/a/19828165/782870 – vida

-5

मैं एक ही आवश्यकता नहीं था क्योंकि मैं एक बार मैं कहीं भी स्पर्श कीबोर्ड छिपाने के लिए किया था मेरे संपादन टेक्स्ट बॉक्स के बाहर। setOnFocusChangeListener नौकरी नहीं करता है भले ही आप संपादन टेक्स्ट बॉक्स के बाहर स्पर्श करते हैं, फिर भी चुना गया है।

इसके लिए मैंने समाधान edc598 here का उपयोग किया।

  • मुझे पहले मुख्य दृश्य युक्त मेनलायआउट मिला और इसमें स्पर्श श्रोता जोड़ें।
  • जब टच इवेंट ट्रिगर किया गया था तो मैं जांचता हूं कि संपादन टेक्स्ट बॉक्स पर ध्यान केंद्रित किया गया है या नहीं।
  • यदि संपादन टेक्स्ट बॉक्स पर ध्यान केंद्रित किया गया है तो मैं ईवेंट के एक्स-वाई समन्वय की जांच करता हूं।
  • मेरी EditText बॉक्स के स्थान के आधार पर मैं कुंजी बोर्ड को छिपाने अगर बॉक्स

कोड का नमूना here से संशोधित बाहर कहीं भी छुआ:

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

दोस्त, आपको हमें इस जादू संख्याओं के साथ मजाक करनी होगी ... –

+0

निश्चित रूप से संपादन टेक्स्ट के बाद निश्चित रूप से सीमाओं की जांच की आवश्यकता नहीं है स्पर्श घटनाओं। – pstoppani

1

तो मैं एक छोटा सा के आसपास खोज की, और कोई अन्य समाधान बिल्कुल वैसा ही नहीं था जिसे मैं ढूंढ रहा था। मेरी राय में फोकस संपादन टेक्स्ट दृश्यों पर अजीब तरीके से व्यवहार करता है।

मैं था क्या किया ...

  1. यकीन है कि रूट दृश्य एक RelativeLayout

  2. एक उपरिशायी लेआउट क्षेत्र है कि कुंजीपटल गायब कर देगा खत्म हो गया है कि जोड़े है, लेकिन नहीं लिखाई में बदलाव। नीचे की तरह कुछ:

मेरे मामले में, EditText स्क्रीन के तल पर एक कंटेनर में था। तो यह सब कुछ और ढंका कवर किया।

  1. एक विधि है कि यह एक तरह एक सा लग रहा है:
 
    private void hideKeyboard() { 
     final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); 
     keyboardOverlay.setVisibility(View.GONE); 
     editText.clearFocus(); 
    } 
  1. अब onClick पर इस विधि कॉल आपके द्वारा बनाए गए ओवरले का।

  2. अब जब हम संपादन टेक्स्ट पर दबाते हैं तो ओवरले दृश्यमान बनाना है। आप ऑनफोकस ईवेंट का उपयोग नहीं कर सकते (कम से कम मुझे इसे काम करने के लिए नहीं मिला ...) तो मैंने जो किया वह मैंने टच इवेंट को प्रबंधित किया।

 
editText.setOnTouchListener(new OnTouchListener() { 

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

requestFocus() यहाँ onTouch साथ फोकस घटना पर हावी नहीं है।

त्वरित सलाह, जब आप इसे आज़माते हैं, तो आप यह देखने के लिए ओवरले में पृष्ठभूमि रंग जोड़ सकते हैं कि वास्तव में क्या हो रहा है।

आशा है कि यह आपके लिए काम करता है!

+0

ऐसा करने का कोई बेहतर तरीका है? – Gohan

11

इस समस्या को आप क्या करना है हल करने के लिए है कि Edittext का इस्तेमाल पहली बार setOnFocusChangeListener है

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

और फिर आप गतिविधि है जो होता है, जो Edittext कोड नीचे देखें में dispatchTouchEvent ओवरराइड है क्या करने की जरूरत

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

अब क्या होगा जब कोई उपयोगकर्ता बाहर क्लिक करता है तो सबसे पहले यह प्रेषण टचएवेंट को बुलाया जाएगा जो तब संपादन से फोकस करेगा, अब आपके ऑनफोकस चेंजलिस्ट को यह कहा जाएगा कि फोकस बदल दिया गया है, अब वह फिर आप कुछ भी जो आप करना चाहते थे क्या कर सकते हैं, आशा है कि यह काम करता है :)

+0

मुझे यह विधि पसंद है। इसके अतिरिक्त, 'एंड्रॉइड जोड़ें: फोकस करने योग्य =" सत्य "' और 'एंड्रॉइड: 'संपादन टेक्स्ट' के प्रत्यक्ष माता-पिता के लेआउट में फोकस करने योग्य इंटचोडोड =" सत्य "। –

+0

'फोकस लूका' होना चाहिए 'ध्यान केंद्रित' होना चाहिए :)) – Stack

0

निम्नलिखित कोड मेरे लिए पूरी तरह से काम करता है, और मैं नियमित रूप से EditText के बाहर कहीं भी SoftKeyboard onTouch बंद करने के लिए इस का उपयोग करें।

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

तो तुम सिर्फ अपने onCreate() विधि और voilla में एक बार setupUI() समारोह कॉल करने के लिए की जरूरत है, अपने hidingSoftKeyboard सेटअप है!

संपादन टेक्स्ट के पूर्ण ध्यान खोने के लिए, बस अपने hideSoftKeyboard() फ़ंक्शन में editText.clearFocus() करें।

0

आप निम्न चरणों करके इस लक्ष्य को हासिल कर सकते हैं:

जनक दृश्य 1.Make (अपनी गतिविधि की सामग्री देखें) क्लिक करने योग्य और निम्न को जोड़कर फ़ोकस करने योग्य गुण

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

2.Implement एक hideKeyboard() विधि

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

3. आखिरकार, अपने संपादन के फ़ोकस चेंजलिस्ट को सेट करें।

edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       hideKeyboard(v); 
      } 
     } 
    }); 
संबंधित मुद्दे