EditText, बाहर स्पर्श पर स्पष्ट ध्यान दें


100

मेरे लेआउट में शामिल है ListView, SurfaceViewऔर EditText। जब मैं क्लिक करता हूं EditText, तो यह फोकस प्राप्त करता है और ऑन-स्क्रीन कीबोर्ड पॉप अप होता है। जब मैं कहीं बाहर क्लिक करता हूं EditText, तब भी इसका फोकस (यह नहीं होना चाहिए) है। मुझे लगता है कि मैं OnTouchListenerलेआउट में अन्य विचारों पर सेट कर सकता हूं और मैन्युअल रूप से EditTextध्यान केंद्रित कर सकता हूं । लेकिन लगता है बहुत हैक ...

अन्य लेआउट में भी मेरी यही स्थिति है - विभिन्न प्रकार की वस्तुओं के साथ सूची दृश्य, जिनमें से कुछ के EditTextअंदर है। मैंने जैसा ऊपर लिखा था वैसा ही वे अभिनय करते हैं।

EditTextजब उपयोगकर्ता इसके बाहर किसी चीज को छूता है, तो काम को फोकस बनाना है।

मैंने यहाँ ऐसे ही सवाल देखे हैं, लेकिन इसका कोई हल नहीं निकला है ...

जवाबों:


66

मैंने इन सभी समाधानों की कोशिश की। edc598 काम करने के सबसे करीब था, लेकिन स्पर्श की घटनाओं Viewको लेआउट में निहित अन्य एस पर ट्रिगर नहीं किया गया था । यदि किसी को इस व्यवहार की आवश्यकता होती है, तो मैंने यही किया:

मैंने लेआउट में अंतिम के रूप में टचइंटरसेप्टरFrameLayout नामक ( इनविजिबल ) बनाया Viewताकि यह सब कुछ खत्म हो जाए ( संपादित करें: आपको RelativeLayoutपेरेंट लेआउट के रूप में भी उपयोग करना होगा और टचइंटरसेप्टर fill_parent विशेषताओं को देना होगा )। तब मैंने इसका उपयोग स्पर्शों को रोकने और यह निर्धारित करने के लिए किया था कि स्पर्श शीर्ष पर था EditTextया नहीं:

FrameLayout touchInterceptor = (FrameLayout)findViewById(R.id.touchInterceptor);
touchInterceptor.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (mEditText.isFocused()) {
                Rect outRect = new Rect();
                mEditText.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
                    mEditText.clearFocus();
                    InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return false;
    }
});

टच हैंडलिंग को गिरने देने के लिए झूठी वापसी करें।

यह हैकिंग है, लेकिन यह केवल एक चीज है जो मेरे लिए काम करती है।


20
आप अपनी गतिविधि में डिस्पैचटॉइवेंट (MotionEvent ev) को ओवरराइड करके एक अतिरिक्त लेआउट को जोड़ने के बिना एक ही काम कर सकते हैं।
पीसी

क्लीयरफोकस () संकेत के लिए धन्यवाद, इसने मेरे लिए SearchView पर भी काम किया
जिमी इलेनॉला

1
मैं नीचे दिए गए @ zMan के उत्तर की ओर संकेत करना चाहूंगा। यह इस पर आधारित है, लेकिन इसे देखने की जरूरत नहीं है stackoverflow.com/a/28939113/969016
लड़का

इसके अलावा, यदि कोई ऐसी स्थिति का सामना करता है, जो कीबोर्ड छुपा नहीं रहा है, लेकिन समाशोधन पर ध्यान केंद्रित करता है, hideSoftInputFromWindow()तो पहले स्पष्ट रूप से आह्वान करें
अहमेत गोकादि

230

केन के उत्तर पर बिल्डिंग, यहां सबसे मॉड्यूलर कॉपी और पेस्ट समाधान है।

कोई XML की जरूरत है।

इसे अपनी गतिविधि में रखें और यह उस गतिविधि के भीतर अंशों सहित सभी EditTexts पर लागू होगा।

@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())) {
                v.clearFocus();
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
            }
        }
    }
    return super.dispatchTouchEvent( event );
}

12
ठीक लगता है। फिर भी मेरा एक मुद्दा है, मेरे सभी संपादित पाठ स्क्रॉल दृश्य के अंदर हैं और शीर्ष संपादित पाठ में हमेशा कर्सर दिखाई देता है। यहां तक ​​कि जब मैं बाहर क्लिक करता हूं, तो फोकस खो जाता है और कीबोर्ड चला जाता है, लेकिन कर्सर अभी भी टॉप एडिट टेक्स्ट में दिखाई देता है।
वैभव गुप्ता

1
सबसे अच्छा समाधान मैं भर आया !! इससे पहले मैं @ ऑवरराइड पब्लिक बुलियन ऑनटच (देखें v, MotionEvent इवेंट) {if (v.getId ()! = Search_box.getId ()) {if (search_box.hasFocus) ()) {InputMethodManager imm = (InputMethodManager) getSystemService सर्विस का उपयोग कर रहा था। Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow (search_box.getWindowToken (), 0); search_box.clearFocus (); } विवरण झूठा है; } विवरण झूठा है; }
प्रदीप कुमार कुशवाहा

सरल, संक्षिप्त, कार्यात्मक! सुनिश्चित करने के लिए सबसे अच्छा समाधान। धन्यवाद
अलेक्जेंडर

13
सबसे अच्छा समाधान मैंने पहले कभी नहीं देखा! मैं इस कोड को अपने बेटे और पोते को पारित करने के लिए अपनी जिरह में सहेजूंगा।
फैन Applelin

2
यदि उपयोगकर्ता किसी अन्य EditText पर क्लिक करता है तो कीबोर्ड तुरंत बंद हो जाता है और फिर से खुल जाता है। इसे हल करने के लिए मैं आपके कोड में बदल MotionEvent.ACTION_DOWNगया MotionEvent.ACTION_UP। शानदार जवाब!
थान्यास ११०१

35

EditText के माता-पिता को देखने के लिए, निम्न 3 गुण "रहने दो सच ":
क्लिक करने योग्य , फ़ोकस करने योग्य , focusableInTouchMode

यदि कोई दृश्य फोकस प्राप्त करना चाहता है, तो उसे इन 3 शर्तों को पूरा करना होगा।

देखें android.view :

public boolean onTouchEvent(MotionEvent event) {
    ...
    if (((viewFlags & CLICKABLE) == CLICKABLE || 
        (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
        ...
        if (isFocusable() && isFocusableInTouchMode()
            && !isFocused()) {
                focusTaken = requestFocus();
        }
        ...
    }
    ...
}

आशा करता हूँ की ये काम करेगा।


पूरी तरह से सही: grepcode.com/file/repository.grepcode.com/java/ext/…
AxeEffect

2
अन्य फ़ोकस करने योग्य दृश्य को फ़ोकस करने के लिए फ़ोकस किए गए दृश्य के माता-पिता होने चाहिए। यदि कोई अन्य पदानुक्रम पर ध्यान केंद्रित करना है तो यह काम नहीं करेगा।
एक्सपेक्टेक्ट

तकनीकी रूप से, आपका कथन गलत है। जनक दृश्य होना चाहिए (clickable) *OR* (focusable *AND* focusableInTouchMode);)
मार्टिन मार्कोसिनी

24

बस इन गुणों को सबसे अधिक माता-पिता में रखें।

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

धन्यवाद दोस्त। मैं पिछले दो घंटे से इस मुद्दे पर संघर्ष कर रहा था। शीर्ष अभिभावकों में इन पंक्तियों को जोड़ने का काम किया।
15

FYI करें: हालांकि यह अधिकांश मामलों के लिए काम करता है, लेकिन यह लेआउट के कुछ आंतरिक तत्वों के लिए काम नहीं कर रहा है।
एसवी माधव रेड्डी

17

केन का जवाब काम करता है, लेकिन यह हैकरी है। जैसा कि उत्तर की टिप्पणी में पीसी दृष्टिकोण करता है, वही कार्य प्रेषण के साथ किया जा सकता है। यह समाधान क्लीनर है क्योंकि यह एक पारदर्शी, डमी फ्रेमलैट के साथ एक्सएमएल को हैक करने से बचता है। यहाँ वह है जो दिखता है:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    EditText mEditText = findViewById(R.id.mEditText);
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        View v = getCurrentFocus();
        if (mEditText.isFocused()) {
            Rect outRect = new Rect();
            mEditText.getGlobalVisibleRect(outRect);
            if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
                mEditText.clearFocus();
                //
                // Hide keyboard
                //
                InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
            }
        }
    }
    return super.dispatchTouchEvent(event);
}

7

मेरे लिए नीचे काम की चीजें -

1. जोड़ा जा रहा है android:clickable="true"और android:focusableInTouchMode="true"करने के लिए parentLayoutकी EditTextयानीandroid.support.design.widget.TextInputLayout

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusableInTouchMode="true">
<EditText
    android:id="@+id/employeeID"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="number"
    android:hint="Employee ID"
    tools:layout_editor_absoluteX="-62dp"
    tools:layout_editor_absoluteY="16dp"
    android:layout_marginTop="42dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_marginRight="36dp"
    android:layout_marginEnd="36dp" />
    </android.support.design.widget.TextInputLayout>

2. गतिविधि वर्ग में ओवरराइडिंग dispatchTouchEventऔर hideKeyboard()फ़ंक्शन सम्मिलित करना

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View view = getCurrentFocus();
            if (view != null && view instanceof EditText) {
                Rect r = new Rect();
                view.getGlobalVisibleRect(r);
                int rawX = (int)ev.getRawX();
                int rawY = (int)ev.getRawY();
                if (!r.contains(rawX, rawY)) {
                    view.clearFocus();
                }
            }
        }
        return super.dispatchTouchEvent(ev);
    }

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

3. EditText के लिए जोड़नाsetOnFocusChangeListener

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

5

आप शायद इस समस्या का उत्तर पहले ही पा चुके हैं, लेकिन मैं इस पर विचार कर रहा हूं कि इसे कैसे हल किया जाए और अभी भी वास्तव में वास्तव में मुझे जो मिल रहा था वह नहीं मिल रहा है इसलिए मुझे लगा कि मैं इसे यहां पोस्ट करूंगा।

मैंने जो किया वह निम्नलिखित था (यह बहुत सामान्यीकृत है, उद्देश्य यह है कि आपको यह विचार करना है कि कैसे आगे बढ़ना है, सभी कोड को कॉपी करना और पेस्ट करना ओ: डी) काम नहीं करेगा:

पहले EditText और किसी भी अन्य विचार को आप अपने कार्यक्रम में एक दृश्य से लपेट कर चाहते हैं। मेरे मामले में मैंने सब कुछ लपेटने के लिए एक रैखिकलेयूट का उपयोग किया।

<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mainLinearLayout">
 <EditText
  android:id="@+id/editText"/>
 <ImageView
  android:id="@+id/imageView"/>
 <TextView
  android:id="@+id/textView"/>
 </LinearLayout>

फिर अपने कोड में आपको अपने मुख्य रैखिक के लिए एक टच श्रोता सेट करना होगा।

final EditText searchEditText = (EditText) findViewById(R.id.editText);
mainLinearLayout.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if(searchEditText.isFocused()){
                if(event.getY() >= 72){
                    //Will only enter this if the EditText already has focus
                    //And if a touch event happens outside of the EditText
                    //Which in my case is at the top of my layout
                    //and 72 pixels long
                    searchEditText.clearFocus();
                    InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
            Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show();
            return false;
        }
    });

मुझे उम्मीद है कि इससे कुछ लोगों को मदद मिलेगी। या कम से कम उन्हें अपनी समस्या को हल करने में मदद करता है।


हां, मैं भी इसी तरह के समाधान के लिए आया हूं। तब मैंने opengl पर c ++ में एंड्रॉइड व्यू सिस्टम के सबसेट को पोर्ट किया था और उसमें यह फीचर बनाया था)
नोट 173

यह वास्तव में बहुत साफ-सुथरा उदाहरण है। मैं इस तरह के एक कोड की तलाश में था, लेकिन मुझे जो कुछ भी मिला वह था जटिल समाधान। मैंने दोनों XY को अधिक सटीक होने के लिए उपयोग किया क्योंकि मेरे पास कुछ बहु-पंक्ति EditText भी थे। धन्यवाद!
सुमितक

3

बस उस के मूल के दो गुणों को परिभाषित करें EditText:

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

इसलिए जब उपयोगकर्ता EditTextक्षेत्र के बाहर स्पर्श करेगा , तो फ़ोकस हटा दिया जाएगा क्योंकि फ़ोकस को पैरेंट दृश्य में स्थानांतरित कर दिया जाएगा।


2

मेरे पास विचारों का ListViewसमावेश है EditText। परिदृश्य कहता है कि एक या एक से अधिक पंक्ति में टेक्स्ट संपादित करने के बाद हमें "फिनिश" नामक बटन पर क्लिक करना चाहिए। मैंने अंदर के दृश्य onFocusChangedपर उपयोग किया है, लेकिन समापन पर क्लिक करने के बाद डेटा सहेजा नहीं जा रहा है। समस्या को जोड़कर हल किया गया थाEditTextlistView

listView.clearFocus();

onClickListener"फिनिश" बटन के लिए अंदर और डेटा सफलतापूर्वक सहेजा गया था।


धन्यवाद। आपने अपना समय बचाया, मेरा यह परिदृश्य पुनर्नवीनीकरण में था और बटन पर क्लिक करने के बाद अंतिम editText मान खो रहा था, क्योंकि पिछले editText फोकस में परिवर्तन नहीं हुआ और इसलिए onFocusChanged को नहीं बुलाया गया। मैं एक ऐसा समाधान खोजना चाहता हूं, जो पिछले editText को बना दे जब इसके बाहर ध्यान केंद्रित हो जाए, वही बटन क्लिक करें ... और अपना समाधान खोजें। यह, महान काम किया है!
रेहेन फ़र्शबाफ़

2

मुझे वास्तव में लगता है कि यह उपयोग करने के लिए अधिक मजबूत तरीका getLocationOnScreenहै getGlobalVisibleRect। क्योंकि मैं एक समस्या से मिलता हूं। एक सूची है जिसमें कुछ Edittext होते हैं और ajustpanगतिविधि में सेट होते हैं। मुझे getGlobalVisibleRectऐसा मान मिलता है जो इसमें स्क्रॉल की तरह दिखता है, लेकिन Event.getRawY हमेशा स्क्रीन द्वारा होता है। नीचे दिया गया कोड अच्छा काम करता है।

public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        View v = getCurrentFocus();
        if ( v instanceof EditText) {
            if (!isPointInsideView(event.getRawX(), event.getRawY(), v)) {
                Log.i(TAG, "!isPointInsideView");

                Log.i(TAG, "dispatchTouchEvent clearFocus");
                v.clearFocus();
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
            }
        }
    }
    return super.dispatchTouchEvent( event );
}

/**
 * Determines if given points are inside view
 * @param x - x coordinate of point
 * @param y - y coordinate of point
 * @param view - view object to compare
 * @return true if the points are within view bounds, false otherwise
 */
private boolean isPointInsideView(float x, float y, View view) {
    int location[] = new int[2];
    view.getLocationOnScreen(location);
    int viewX = location[0];
    int viewY = location[1];

    Log.i(TAG, "location x: " + location[0] + ", y: " + location[1]);

    Log.i(TAG, "location xWidth: " + (viewX + view.getWidth()) + ", yHeight: " + (viewY + view.getHeight()));

    // point is inside view bounds
    return ((x > viewX && x < (viewX + view.getWidth())) &&
            (y > viewY && y < (viewY + view.getHeight())));
}

आपको बहुत - बहुत धन्यवाद! यह RecyclerView, आदि जैसे सभी लेआउट परिदृश्यों के लिए काम करता है। मैंने अन्य समाधान की कोशिश की, लेकिन यह सब फिट बैठता है! :) अच्छा काम!
वोप्पी

1

अन्य दृश्य को छूने पर फ़ोकस खोने के लिए, दोनों दृश्य view.focusableInTouchMode (true) के रूप में सेट किए जाने चाहिए।

लेकिन ऐसा लगता है कि टच मोड में फ़ोकस का उपयोग अनुशंसित नहीं है। कृपया यहाँ देखें : http://android-developers.blogspot.com/2008/12/touch-mode.html


हां, मैंने इसे पढ़ा है, लेकिन यह बिल्कुल वैसा नहीं है जैसा मैं चाहता हूं। मुझे ध्यान केंद्रित करने के लिए अन्य दृश्य की आवश्यकता नहीं है। हालाँकि मुझे अभी कोई वैकल्पिक रास्ता नहीं दिखाई दे रहा है ... हो सकता है, उपयोगकर्ता द्वारा गैर-ध्यान केंद्रित करने वाले बच्चे पर क्लिक करने पर ध्यान केंद्रित करने के लिए किसी तरह मूल दृश्य बनाया जाए?
नोट 173

जब तक मैं जानता हूं, फोकस को एक वर्ग द्वारा प्रबंधित नहीं किया जा सकता है, यह एंड्रॉइड द्वारा प्रबंधित किया जाता है ... कोई विचार नहीं :(
मंचेरियो

0

सबसे अच्छा तरीका डिफ़ॉल्ट विधि का उपयोग है clearFocus()

आप जानते हैं कि onTouchListenerसही में कोड कैसे हल करें ?

बस बुलाओ EditText.clearFocus()। इसमें स्पष्ट ध्यान केंद्रित होगा last EditText


0

जैसा कि @ pcans ने सुझाव दिया है कि आप इसे dispatchTouchEvent(MotionEvent event)अपनी गतिविधि में ओवरराइड कर सकते हैं ।

यहां हमें स्पर्श निर्देशांक मिलते हैं और उनकी तुलना सीमा देखने के लिए की जाती है। यदि स्पर्श किसी दृश्य के बाहर किया जाता है तो कुछ करें।

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        View yourView = (View) findViewById(R.id.view_id);
        if (yourView != null && yourView.getVisibility() == View.VISIBLE) {
            // touch coordinates
            int touchX = (int) event.getX();
            int touchY = (int) event.getY();
            // get your view coordinates
            final int[] viewLocation = new int[2];
            yourView.getLocationOnScreen(viewLocation);

            // The left coordinate of the view
            int viewX1 = viewLocation[0];
            // The right coordinate of the view
            int viewX2 = viewLocation[0] + yourView.getWidth();
            // The top coordinate of the view
            int viewY1 = viewLocation[1];
            // The bottom coordinate of the view
            int viewY2 = viewLocation[1] + yourView.getHeight();

            if (!((touchX >= viewX1 && touchX <= viewX2) && (touchY >= viewY1 && touchY <= viewY2))) {

                Do what you want...

                // If you don't want allow touch outside (for example, only hide keyboard or dismiss popup) 
                return false;
            }
        }
    }
    return super.dispatchTouchEvent(event);
}

यदि आपकी गतिविधि का लेआउट रनटाइम के दौरान नहीं बदलता है (जैसे आप टुकड़े नहीं जोड़ते हैं या लेआउट से दृश्य हटाते हैं) तो दृश्य अस्तित्व और दृश्यता की जांच करना भी आवश्यक नहीं है। लेकिन यदि आप कस्टम संदर्भ मेनू को बंद करना चाहते हैं (या कुछ अनौपचारिक) कस्टम संदर्भ मेनू (जैसे Google Play Store में जब आइटम का अतिप्रवाह मेनू का उपयोग करना चाहते हैं) तो यह दृश्य अस्तित्व की जांच करने के लिए आवश्यक है। नहीं तो आपको ए NullPointerException


0

कोड का यह सरल स्निपेट वही करता है जो आप चाहते हैं

GestureDetector gestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                KeyboardUtil.hideKeyboard(getActivity());
                return true;
            }
        });
mScrollView.setOnTouchListener((v, e) -> gestureDetector.onTouchEvent(e));

0

कोटलिन में

Hidekeyboard () एक कोटलिन एक्सटेंशन है

fun Activity.hideKeyboard() {
    hideKeyboard(currentFocus ?: View(this))
}

गतिविधि में dispatchTouchEvent जोड़ें

override fun dispatchTouchEvent(event: MotionEvent): Boolean {
    if (event.action == MotionEvent.ACTION_DOWN) {
        val v: View? = currentFocus
        if (v is EditText) {
            val outRect = Rect()
            v.getGlobalVisibleRect(outRect)
            if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
                v.clearFocus()
                hideKeyboard()
            }
        }
    }
    return super.dispatchTouchEvent(event)
}

इन गुणों को शीर्ष अधिकांश माता-पिता में जोड़ें

android:focusableInTouchMode="true"
android:focusable="true"

0

यह मेरा संस्करण zMan के कोड पर आधारित है। यदि अगला दृश्य भी एक संपादित पाठ है तो यह कीबोर्ड को छिपाएगा नहीं। अगर उपयोगकर्ता सिर्फ स्क्रीन को स्क्रॉल करता है तो यह कीबोर्ड को छिपाएगा भी नहीं।

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        downX = (int) event.getRawX();
    }

    if (event.getAction() == MotionEvent.ACTION_UP) {
        View v = getCurrentFocus();
        if (v instanceof EditText) {
            int x = (int) event.getRawX();
            int y = (int) event.getRawY();
            //Was it a scroll - If skip all
            if (Math.abs(downX - x) > 5) {
                return super.dispatchTouchEvent(event);
            }
            final int reducePx = 25;
            Rect outRect = new Rect();
            v.getGlobalVisibleRect(outRect);
            //Bounding box is to big, reduce it just a little bit
            outRect.inset(reducePx, reducePx);
            if (!outRect.contains(x, y)) {
                v.clearFocus();
                boolean touchTargetIsEditText = false;
                //Check if another editText has been touched
                for (View vi : v.getRootView().getTouchables()) {
                    if (vi instanceof EditText) {
                        Rect clickedViewRect = new Rect();
                        vi.getGlobalVisibleRect(clickedViewRect);
                        //Bounding box is to big, reduce it just a little bit
                        clickedViewRect.inset(reducePx, reducePx);
                        if (clickedViewRect.contains(x, y)) {
                            touchTargetIsEditText = true;
                            break;
                        }
                    }
                }
                if (!touchTargetIsEditText) {
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
    }
    return super.dispatchTouchEvent(event);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.