Noman Arain
Noman Arain

Reputation: 1162

How to hide the soft keyboard in android after doing something outside of edittext which is in ArrayAdapter?

I have an edittext, when I click in it, I get the number soft keyboard, which is what I need. But when I click outside of the edittext, I get the regular keyboard, but I need to hide the keyboard after the user clicks outside the edittext. The keyboard should disappear on scroll as well, not only on OnClick.

public View getView(int position, View convertView, ViewGroup parent) {
            StoreSkuInfo storeSkuInfo = StoreSkuInfoList.get(position);  

            View row = convertView;
            String status="";
            StoreSkuHolder holder = null;

            if (row ==null) {    

                LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                row = mInflater.inflate(R.layout.pip_pickupinstore_listcell, null);

                holder = new StoreSkuHolder();

                            holder.qtyText = (EditText)row.findViewById(R.id.pip_qty_et);
                holder.qtyLL = (LinearLayout)row.findViewById(R.id.qty_LL);
                holder.pipQuantityStatus = (TextView) row.findViewById(R.id.quantity_status);
                holder.relativeLayoutStoreInfo = (RelativeLayout) row.findViewById(R.id.RelativeLayoutStoreInfo);
                holder.relativeLayoutAisleBay = (RelativeLayout) row.findViewById(R.id.RelativeLayoutAisleBay);


                row.setTag(holder);

            }else{
                holder = (StoreSkuHolder)row.getTag();
            }
}

As we know this getView method gets called many times, so putting the following code in getView method brings up the keyboard up and down every second when edittext is clicked.

holder.qtyText.setOnFocusChangeListener(new OnFocusChangeListener() {

                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    // TODO Auto-generated method stub
                    if(hasFocus) {
                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
                    }
                    if(!hasFocus) {
                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
//                      imm.hideSoftInputFromWindow(v.getWindowToken(), 1);
                    }
                }
            });

How can this be fixed?

EDIT: Tried the answer by Shruti as below. I put the following code in parent class:

public static void hideSoftKeyboard(Activity activity) 
    {

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

Then in the OnCreate, I put:

findViewById(android.R.id.content).getRootView().setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d(TAG, "In setOnTouchListener of root");
                hideSoftKeyboard(PIPActivity.this);
                return false;
            }
        });

But the code doesn't even go into this TouchListener.

EDIT 2 I tried Shashank Agarwal answers. But his answer is particular to the layout. I need the keyboard to disappear if user clicks anywhere else. Below is a picture to clarify.

Activity Layouts

XML Layout where the EDITTEXT is below. I have deleted some lines from it to try and keep it to the point. The EditText in discussion is in the bottom with this: android:id="@+id/pip_qty_et"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/shiptostore_cell"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dip"
    android:background="@color/ce"
    android:onClick="onClick"
    android:clickable="true"
    android:focusable="true"
    android:orientation="horizontal" >

    <RelativeLayout
        android:id="@+id/pip_store_cell_rl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dip"
        android:layout_marginBottom="20dip"
        android:gravity="center"
        android:paddingBottom="5dp"
        android:paddingRight="5dp"
        android:paddingTop="5dp" >

       <com.HDTextView
            android:id="@+id/pickupinstore_availtoday"
            style="@style/Normal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dip"
            android:layout_below="@+id/pickupinstore_milesaway"
            android:text="Available for Pick Up TODAY"
            android:textColor="@color/C7" />

        <RelativeLayout
            android:id="@+id/RelativeLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/pickupinstore_availtoday"
            android:layout_marginTop="15dip" >

            <com.HDTextView
                android:id="@+id/seperator"
                android:layout_width="0dip"
                android:layout_height="0dip"
                android:layout_centerInParent="true" />

            <RelativeLayout
                android:id="@+id/RelativeLayoutAisleBay"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:layout_marginLeft="3dp"
                android:layout_toLeftOf="@id/seperator"
                android:visibility="gone" >

                <com.HDTextView
                    android:id="@+id/pickupinstore_bin"
                    style="@style/Small"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="8dip"
                    android:layout_toRightOf="@+id/pickupinstore_aisle"
                    android:maxWidth="70dp"
                    android:singleLine="true"
                    android:text="Bay [x]"
                    android:textColor="@color/RGB51" />

            </RelativeLayout>

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="2dip"
                android:layout_toRightOf="@id/storeLocationButton"
                android:gravity="center" >

                <com.HDTextView
                    android:id="@+id/quantity_status"
                    style="@style/SmallBold"
                    android:layout_width="wrap_content"
                    android:layout_height="20dp"
                    android:layout_gravity="center_vertical"
                    android:layout_marginRight="5dp"
                    singleLine="true"
                    android:background="@drawable/bevelededge_mob_lightest_green"
                    android:gravity="center"
                    android:minWidth="20dp"
                    android:paddingLeft="2dp"
                    android:paddingRight="2dp"
                    android:text="99"
                    android:textColor="@color/White"
                    android:textSize="12dip" />

            </RelativeLayout>
        </RelativeLayout>

        <LinearLayout 
            android:id="@+id/qty_LL"
            android:layout_width="50dip"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:orientation="vertical"
            android:clickable="true"
            android:focusable="true"
            android:layout_alignParentRight="true">

                <com.HDTextView
                    style="@style/Small"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:singleLine="true"
                    android:text="QTY"
                    android:textColor="@color/Grey" />

                <EditText
                    android:id="@+id/pip_qty_et"
                    android:layout_width="45dip"
                    android:layout_height="wrap_content"
                    android:background="@null"
                    android:layout_alignParentRight="true"
                    android:focusable="true"
                    android:focusableInTouchMode="true"
                    android:imeOptions="actionDone"
                    android:gravity="center"
                    android:hint="5"
                    android:onClick="test"
                    android:inputType="number"
                    android:maxLength="3" />

        </LinearLayout>"


        <RelativeLayout
            android:id="@+id/RelativeLayoutStoreInfo"
            android:layout_width="150dip"
            android:layout_height="wrap_content"
            android:layout_above="@+id/RelativeLayout"
            android:layout_alignLeft="@+id/pickupinstore_storename"
            android:layout_alignParentTop="true">
        </RelativeLayout>
    </RelativeLayout>

</LinearLayout>

Upvotes: 0

Views: 2439

Answers (5)

himanshu Verma
himanshu Verma

Reputation: 41

I know its too late and it might not help you but this will help for someone else. If you want to hide the default keyboard then you can add the following line in your EditText's XML file.

android:keyboardNavigationCluster="false"

Upvotes: 1

Noman Arain
Noman Arain

Reputation: 1162

This is what I did. This worked since I needed the keyboard to hide itself on click or scroll.

@Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
                if (getCurrentFocus() != null) {
                      InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                      imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
                    }
            return super.dispatchTouchEvent(ev);
        }

Upvotes: 0

Siddharth_Vyas
Siddharth_Vyas

Reputation: 10100

This will work :

    @Override
public boolean dispatchTouchEvent(MotionEvent event) {

    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);

    if (v instanceof EditText) {
        View w = getCurrentFocus();
        int scrcoords[] = new int[2];
        w.getLocationOnScreen(scrcoords);
        float x = event.getRawX() + w.getLeft() - scrcoords[0];
        float y = event.getRawY() + w.getTop() - scrcoords[1];

        Log.d("Activity",
                "Touch event " + event.getRawX() + "," + event.getRawY()
                        + " " + x + "," + y + " rect " + w.getLeft() + ","
                        + w.getTop() + "," + w.getRight() + ","
                        + w.getBottom() + " coords " + scrcoords[0] + ","
                        + scrcoords[1]);
        if (event.getAction() == MotionEvent.ACTION_UP
                && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
                        .getBottom())) {

            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                    .getWindowToken(), 0);
        }
    }
    return ret;
}

Upvotes: 0

Shruti
Shruti

Reputation: 5591

Sample layout xml file.

<RelativeLayout android:id="@+id/rootLayout"...

<Textview.../>
<Button../>

....
...

<RelativeLayout/>

In the above sample relative layout is the rootLayout.

By rootLayout I mean the parent layout for that layout.

In your case it is LinearLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/shiptostore_cell"..../>

Try this :

public static void hideSoftKeyboard(Activity activity) 
    {

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

call this function on touch of the root layout and it will work.

rootLayout.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                hideSoftKeyboard(QuestionTemplateActivity.this);
                return false;
            }
        });

Upvotes: 1

Smogger
Smogger

Reputation: 553

Put this code outside the onCreate

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

In you layout xml file put this line on the parent layout so it became clickable

android:onClick="onClick"   

Upvotes: 1

Related Questions