Tap outside edittext to lose focus

后端 未结 9 1589
萌比男神i
萌比男神i 2020-12-24 02:02

I just want when click outside the \"edittext\" to automatically lose focus and hide keyboard. At the moment, if I click on the \"edittext\" it focuses but i need to hit the

相关标签:
9条回答
  • 2020-12-24 02:45

    The following code works perfectly for me, and I regularly use this for closing the SoftKeyboard onTouch anywhere outside the EditText.

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

    So you just need to call the setupUI() function once in your onCreate() method and voilla, your hidingSoftKeyboard is setup!

    For Losing complete focus of the EditText, simply do editText.clearFocus() in your hideSoftKeyboard() function.

    0 讨论(0)
  • 2020-12-24 02:47

    I had the same requirement as I had to hide the keyboard once I touch anywhere outside my EditText box. The setOnFocusChangeListener does not do the job as even if you touch outside the edit text box is still selected.

    For this I used the solution edc598 here.

    • I first got the MainLayout containing the whole view and add touch listener to it.
    • When onTouch event was triggered I check if the EditText box has focus.
    • If the EditText box has focus then I check the event's X-Y co-ordinates.
    • Based on the placement of my EditText box I hide the key board if touched anywhere outside the box

    Code sample modified from 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;
        }
    });
    
    0 讨论(0)
  • 2020-12-24 02:52

    So I searched around a little bit, and no other solutions was exactly what I was looking for. In my opinion the focus behave strangely on EditText views.

    What I did was...

    1. Make sure the root view is a RelativeLayout

    2. Add an overlay layout that is OVER the area that will make the keyboard disapear, but not the EditText. Something like below:

    In my case, the EditText was in a container at the bottom of the screen. so it covered everyhting else.

    1. Have a method that looks a bit like this one :
        private void hideKeyboard() {
            final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
            keyboardOverlay.setVisibility(View.GONE);
            editText.clearFocus();
        }
    
    1. Now call this method on the onClick of the overlay you created.

    2. What we want now is to make the overlay visible when you press on the editText. You cannot use the onFocus event (at least I did not get it to work...) So what i did is I managed the onTouch event instead.

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

    The requestFocus() here is to not override the focus event with the onTouch.

    Quick advice, when you try this out, you can add a background color to the overlay to see exactly what is happening.

    Hope it works for you!

    0 讨论(0)
提交回复
热议问题