getCurrentFocus is null when trying to hide the keyboard - android

I have a RelativeLayout nested inside another RelativeLayout. By default, it is hidden. When user clicks a button, the nested RelativeLayout becomes visible. This layout contains an EditText. When user is finished typing, I want to hide the keyboard:
<RelativeLayout
...
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/cameraEmoji"
android:contentDescription="#string/camera_emoji"
android:src="#mipmap/ic_image_black_24dp"
android:layout_alignParentRight="true"
android:layout_below="#+id/cameraText"
android:layout_marginStart="57dp" />
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="#+id/emojiTextView"
android:background="#80444444">
<EditText
android:id="#+id/actionEmojiText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:background="#FFF"
android:imeActionId="#+id/finishText"
android:imeActionLabel="#string/action_complete_emoji_text"
android:imeOptions="actionDone"
android:maxLines="1"
android:singleLine="true"/>
</RelativeLayout>
...
</RelativeLayout>
The activity:
cameraText = (ImageButton)findViewById(R.id.cameraText);
cameraText.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
emojiTextView = (RelativeLayout) findViewById(R.id.emojiTextView);
emojiTextView.setVisibility(View.VISIBLE);
final EditText actionEmojiText = (EditText)findViewById(R.id.actionEmojiText);
actionEmojiText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
#Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == EditorInfo.IME_ACTION_UNSPECIFIED) {
emojiTextView.setVisibility(View.INVISIBLE);
View view = MainActivity.this.getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
dropTextIn(actionEmojiText);
}
return false;
}
});
}
});
getCurrentFocus returns null but the keyboard remains visible. How can I hide the keyboard after typing in the EditText field?

editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
try to add these two properties to EditText, It will hide keyboard whenever you touch any other view after typing to Edittext

I discovered what appears to be the issue. getCurrentFocus() was returning null because the item I had focused I had set to View.INVISIBLE before invoking getCurrentFocus(). Consequently, the view was no longer visible and thus no longer focused.

Related

Hide the keyboard after clicking on the EditText

I'm using Date and Time Picker to handle the meeting date field, so there is no need for the keyboard. How can I prevent the keyboard from showing after clicking on the field?enter image description here
There is a better way of programatically hiding the keyboard.
Go in xml and add the following attribute android:focusable="false"
E.g
<EditText
android:id="#+id/time_date_et"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="#font/prompt_light"
android:focusable="false"
android:textSize="17sp" />
The above attribute ensures that the keyboard won't appear!
You can use property android:focusableInTouchMode="false" in xml
<com.google.android.material.textfield.TextInputEditText
android:id="#+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusableInTouchMode="false"
android:inputType="text|date"/>
And add click listener to this view in code
editText.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
//show date picker
}
});
val activity: Activity = this //if you are in the Activity
val imm = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
var view = activity.currentFocus
if (view == null) {
view = View(activity)
}
imm.hideSoftInputFromWindow(view.windowToken, 0)
this piece of code should hide your virtual keyboard. Just put it in a method and call. :)

Change keyboard's text pad with number pad

I have EditText and input type is textNoSuggestions.
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="5dp">
<EditText
android:id="#+id/firstName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Name"
android:inputType="textNoSuggestions" />
</android.support.design.widget.TextInputLayout>
Also i have one button and in button onclick method i try to change keyboard's input type.This is a source
final Button changeKeyboard = (Button) dialog.findViewById(R.id.change_keyboard);
changeKeyboard.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
firsName.setRawInputType(InputType.TYPE_CLASS_NUMBER);
}
});
Is it a possible to change keyboards' input type in button click when keyboard is showing?
How i can solve my problem thanks everyone
set is setTransformationMethod(), not setInputType(). So something like:
firstName.setTransformationMethod(numberTransformationMethod.getInstance());
On your code, change:
firsName.setRawInputType(InputType.TYPE_CLASS_NUMBER);
to this (firstName with "t", the name on your xml):
firstName.setRawInputType(InputType.TYPE_CLASS_NUMBER);
Also, you positively can change your keyboard calling setInputType, like this: firstName.setInputType(x), where x is an int and can be 1 (alfanumeric); 2 (numeric) or 3 (phone like).
EDIT:
You can hide your keyboard calling this on your activity:
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
//Find the currently focused view, so we can grab the correct window token from it.
View view = activity.getCurrentFocus();
//If no view currently has focus, create a new one, just so we can grab a window token from it
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
firsName.setInputType(InputType.TYPE_CLASS_NUMBER);

Keyboard not displayed onClick EditText

I'm struggling to get my keyboard to display in my EditText. When I click the EditText for the first time, the keyboard displays and behaves normally.
When I press the back button to hide the keyboard and click the same EditText again, the keyboard fails to display. I'd really appreciate any help. The relevant code is below.
NewEntry:
assessor.setOnEditorActionListener(new TextView.OnEditorActionListener() {
#Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
EditText email = (EditText) context.findViewById(R.id.email);
email.requestFocus();
return true;
}
Layout:
<EditText
android:layout_height="72dp"
android:layout_width="wrap_content"
android:id="#+id/assessor"
android:textColor="#color/black"
android:textSize="20dp"
android:background="#android:color/transparent"
android:fontFamily="sans-serif-light"
android:layout_marginLeft="72dp"
android:layout_marginRight="16dp"
android:hint="Assessor"
android:inputType="text"
android:imeOptions="actionNext"
android:ems="10"
android:windowSoftInputMode="adjustPan"
/>
Try this:
set an onClickListener for the EditText, and when it is clicked it will request focus
EditTextName.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View view) {
editText.requestFocus();
}
I don't know if this will solve your problem, but at least i tried :P

android edittext remove focus after clicking a button

I have an Activity with an EditText and a Button.
When the User clicks on the EditText, the keyboard is shown and he can type in some Text - fine.
But when the user clicks on the Button I want the EditText to be no more in focus i.e. the keyboard hides til the user clicks again on the EditText.
What can I do to 'hide the focus' of the EditText, after the Button is clicked.
Some Code I can add in the OnClick Method of the Button to do that?
EDIT:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="#+id/edt_SearchDest"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="0.8"
android:textSize="18sp"
android:hint="Enter your look-up here.." />
<Button
android:id="#+id/btn_SearchDest"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:text="Search" />
</LinearLayout>
Best Regards
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.
One workaround is to create a fake view to transfer focus to when you clearFocus in your edittext:
<EditText
android:id="#+id/edt_thief"
android:layout_width="0dp"
android:layout_height="0dp"
android:focusable="true"
android:focusableInTouchMode="true"
Note that this view is invisible so it doesn't require any space in the layout.
In the control class, you can add a method like the following to trigger this focus transfer:
public void clearFocus(){
yourEdittext.clearFocus();
edtThief.requestFocus();
}
You can then minimize the keyboard once edtThief has focus:
public static void hideKeyboard(final View view) {
InputMethodManager imm = (InputMethodManager) view.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
I've successfully used the following in the onClick button code:
editText.setEnabled(false);
editText.setEnabled(true);
Somewhat less complex than other methods...
The most elegant solution that I could find is this:
You can save this method in your utility class:
public static void hideSoftKeyboard(Activity activity) {
if (activity == null) return;
if (activity.getCurrentFocus() == null) return;
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
By simply calling hideSoftKeyboad() method it will hide the keyboard but as you can see, the focus will still be present.
In order to remove the focus we will use a simple trick. Right above your input controls, add a dummy view like this:
<View
android:id="#+id/dummy"
android:layout_width="1dp"
android:layout_height="1dp"
android:focusable="true"
android:focusableInTouchMode="true" />
Then, write this line of code at the place where you call the focus-hiding method:
theTextView.clearFocus();
Since the app needs to pass the focus to the next control it will be passed to our invisible view.
How i solved it.
// xml file
<LinearLayout
...
android:id="#+id/linear_layout"
android:focusableInTouchMode="true"> // 1. make this focusableInTouchMode...
</LinearLayout>
// Activity file
private LinearLayout mLinearLayout; // 2. parent layout element
private Button mButton;
mLinearLayout = findViewById(R.id.linear_layout);
mButton = findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
mLinearLayout.requestFocus(); // 3. request focus
}
});
I hope this helps you :)
The top answer definitely works but would add a lot of unnecessary codes in my use case, where there are many buttons and every one of them will need a setOnClickListener code block to remove focus from the EditText.
Instead, my approach is to write a BindingAdapter to perform both focus change and the intended click action.
BindingAdapter
#BindingAdapter("onClickWithFocusChange")
fun View.setOnClickWithFocusChangeListener(clickListener: View.OnClickListener?) {
clickListener?.also {
setOnClickListener(OnClickWithFocusChangeListener(it))
} ?: setOnClickListener(null)
}
class OnClickWithFocusChangeListener(
private val clickListener: View.OnClickListener
) : View.OnClickListener {
override fun onClick(v: View?) {
v?.requestFocusFromTouch()
clickListener.onClick(v)
v?.clearFocus()
}
}
In xml (databinding can now be used instead of programmatically setting every one of the clicklisteners):
<!-- parentview of the EditText -->
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true">
<ImageButton
...
onClickWithFocusChange="#{() -> viewModel.buttonClicked()}"
... />
In activity/fragment:
editText.setOnFocusChangeListener { v, hasFocus ->
if (!hasFocus) {
requireContext().hideKeyboard(v)
v.clearFocus()
}
}
And lastly the extension function:
fun Context.hideKeyboard(view: View) {
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}
Hope this helps some one!
<LinearLayout
android:id="#+id/parent"
android:focusableInTouchMode="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="#+id/edt"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="0.8"
android:textSize="18sp"
android:hint="Enter your look-up here.." />
<Button
android:id="#+id/btn"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:text="Search" />
</LinearLayout>
set android:focusableInTouchMode="true" to the parent layout.
on button click transfer the focus to parent.
binding.btn.setOnClickListener {
binding.parent.requestFocus()
// your stuff here
}
private void hideDefaultKeyboard() {
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);//u have got lot of methods here
}
EDIT:
LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
mTextView.setEnabled(!mTextView.isEnabled());
mTextView.setEnabled(!mTextView.isEnabled());
Sorry late to the answer, but I hope this will be the right answer, as I fixed it using
try {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (v != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
}
} catch (Exception ignored) {
}
mEditText.setSelected(false);
mEditText.setFocusable(false);
mEditText.setFocusableInTouchMode(true);
Write the following snippet on your button click.
Why not just disable the EditText in the Button code? That should get rid of the keyboard and the focus.
edt_SearchDest.setEnabled(false);
If you are trying to create a button like in a notes app, just do the following:
note.setEnabled(false);
note.setEnabled(true);
This will make a kind of checkmark like button (hides keyboard and removes cursor).

Editview press softkey Return, lose focus AND hide keyboard, how?

I'm working on an Android app and I've got 2 editviews and a label. The user can enter 2 values and the label shows some calculation using input from the editviews. What I want is the following;
user enters either value with soft-keyboard
user presses "Return" softkey
editview should lose focus
the soft-keyboard should disappear
textview label should be recalculated
Now, the v.clearFocus only seems to works when there is another widget that can can get focus(?), so I've also added a dummie zero-pixel layout that can 'steal' the focus from the first editview. The Return key works now, but when the user switches focus from edit1 to edit2 by simply tapping then HideKeyboard() crashes. I've tried checking if inputMethodManager==null but that didn't help.
This all feels like I'm hacking to trick Android into doing some common UI behaviour, so I can't help but think that I'm overlooking something here.
Any help would be greatly appreciated. Btw I know this is similar to this question: How to lose the focus of a edittext when "done" button in the soft keyboard is pressed?
But I've tried that and it doesn't work.
So my layout xml is this:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- Dummy control item so that first textview can lose focus -->
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
<EditText
android:id="#+id/editTest1"
android:layout_width="250px"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:imeOptions="actionDone" >
</EditText>
<EditText
android:id="#+id/editTest2"
android:layout_width="250px"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:imeOptions="actionDone" >
</EditText>
<TextView
android:id="#+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="test123" />
</LinearLayout>
And the source is this:
public class CalcActivity extends Activity implements OnFocusChangeListener {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab2_weight);
EditText testedit = (EditText) findViewById(R.id.editTest1);
testedit.setOnFocusChangeListener(this);
testedit.setOnEditorActionListener(new OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(actionId==EditorInfo.IME_ACTION_DONE){
//Clear focus here from edittext
Log.d("test app", "v.clearFocus only works when there are other controls that can get focus(?)");
v.clearFocus();
}
return false;
}
});
}
public void hideSoftKeyboard() {
InputMethodManager inputMethodManager = (InputMethodManager) this.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
}
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus == false) {
Log.d("unitconverter", "onFocusChange hasFocus == false");
// update textview label
TextView bla = (TextView) findViewById(R.id.textView1);
bla.setText(String.format("%s + %s", (((EditText) findViewById(R.id.editTest1)).getText()), (((EditText) findViewById(R.id.editTest2)).getText())));
// hide keyboard
hideSoftKeyboard();
}
}
}

Categories

Resources