Reputation: 1162
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.
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
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
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
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
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
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