EditText, clear focus on touch outside
I tried all these solutions. edc598's was the closest to working, but touch events did not trigger on other View
s contained in the layout. In case anyone needs this behavior, this is what I ended up doing:
I created an (invisible) FrameLayout
called touchInterceptor as the last View
in the layout so that it overlays everything (edit: you also have to use a RelativeLayout
as the parent layout and give the touchInterceptor fill_parent
attributes). Then I used it to intercept touches and determine if the touch was on top of the EditText
or not:
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;
}
});
Return false to let the touch handling fall through.
It's hacky, but it's the only thing that worked for me.
Android edit text wont lose focus when click outside the text view
Implement a touch listener for your root Layout and call
public class SampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_layout, container, false);
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
et.clearFocus();
return true;
}
});
return view;
}
}
how can full clear focus in editText , just like press button DONE on softkeyboard
Firstly, we can use cleareFocus
method to remove the focus.
editTextView.clearFocus()
But when this method is called, as source code comment says:
When not in touch-mode, the framework will try to give focus to the first focusable View from the top after focus is cleared. Hence, if this
View is the first from the top that can take focus, then all callbacks
related to clearing focus will be invoked after which the framework will
give focus to this view.
so after you call it, the first element will stay get the focus. so we should set the touch-mode
true in parent layout.
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
<EditText android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
Android: Force EditText to remove focus?
You can add this to onCreate
and it will hide the keyboard every time the Activity
starts.
You can also programmatically change the focus to another item.
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
How to clear focus for EditText?
Set in your parent layout next attributes:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
And now, when activity
starts this layout getting default focus.
Also we can remove focus from children views in runtime (e.g. after finishing child editing):
findViewById(R.id.mainLayout).requestFocus();
or
Look in the AndroidManifest.xml element.
android:windowSoftInputMode="stateHidden"
It always hide key board when entering the activity.
android edittext remove focus after clicking a button
Put this in your button listener:
InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
EDIT
The solution above will break your app if no EditText
is focused on. Modify your code like this:
add this method to you class:
public static void hideSoftKeyboard (Activity activity, View view)
{
InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getApplicationWindowToken(), 0);
}
Then, in your button listener, call the method like this:
hideSoftKeyboard(MainActivity.this, v); // MainActivity is the name of the class and v is the View parameter used in the button listener method onClick.
How to hide soft keyboard on android after clicking outside EditText?
The following snippet simply hides the keyboard:
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(
Activity.INPUT_METHOD_SERVICE);
if(inputMethodManager.isAcceptingText()){
inputMethodManager.hideSoftInputFromWindow(
activity.getCurrentFocus().getWindowToken(),
0
);
}
}
You can put this up in a utility class, or if you are defining it within an activity, avoid the activity parameter, or call hideSoftKeyboard(this)
.
The trickiest part is when to call it. You can write a method that iterates through every View
in your activity, and check if it is an instanceof EditText
if it is not register a setOnTouchListener
to that component and everything will fall in place. In case you are wondering how to do that, it is in fact quite simple. Here is what you do, you write a recursive method like the following, in fact you can use this to do anything, like setup custom typefaces etc... Here is the method
public void setupUI(View view) {
// Set up touch listener for non-text box views to hide keyboard.
if (!(view instanceof EditText)) {
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard(MyActivity.this);
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);
}
}
}
That is all, just call this method after you setContentView
in your activity. In case you are wondering what parameter you would pass, it is the id
of the parent container. Assign an id
to your parent container like
<RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>
and call setupUI(findViewById(R.id.parent))
, that is all.
If you want to use this effectively, you may create an extended Activity
and put this method in, and make all other activities in your application extend this activity and call its setupUI()
in the onCreate()
method.
Hope it helps.
If you use more than 1 activity define common id to parent layout like<RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>
Then extend a class from Activity
and define setupUI(findViewById(R.id.main_parent))
Within its OnResume()
and extend this class instead of ``Activity in your program
Here is a Kotlin version of the above function:
@file:JvmName("KeyboardUtils")
fun Activity.hideSoftKeyboard() {
currentFocus?.let {
val inputMethodManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)!!
inputMethodManager.hideSoftInputFromWindow(it.windowToken, 0)
}
}
Related Topics
Comparing Two Drawables in Android
Android - Nullpointerexception on Searchview in Action Bar
How to Use Custom Font with Webview
Android - Application (Apk) Maximum Size
How to Globally Force Screen Orientation in Android
How to Display Progress Dialog Before Starting an Activity in Android
Could Not Find Com.Android.Tools.Build:Aapt2:3.2.0
Android Studio Fails to Debug with Error Org.Gradle.Process.Internal.Execexception
Gles10.Glgetintegerv Returns 0 in Lollipop Only
Android Firebase Dynamitemodule: Failed to Load Module Descriptor
Using Contextmenu with Listview in Android
Draw Overlay in Android (System Wide)
Generate Bitmap from HTML in Android
Background-Size: Cover Not Working in Portrait on Android Tablet
What Does -Webkit-Text-Size-Adjust Do
Blurry Svg Images in Chrome for Android
HTML Email Looking Different in Gmail App
Monodroid: Error When Calling Constructor of Custom View - Twodscrollview