For some EditText
views I want to use a custom keyboard instead of the soft one.
The problem is when I click on an EditText
for the first time both keyboards are shown. When I click for the second time - the soft keyboard finally disappeares.
What might be the reason for such behavior?
Here's the code I use:
package pkleczek.profiwan.keyboards;
import android.app.Activity;
import android.inputmethodservice.KeyboardView;
import android.text.InputType;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
public abstract class CustomKeyboard {
/** A link to the KeyboardView that is used to render this CustomKeyboard. */
protected KeyboardView mKeyboardView;
/** A link to the activity that hosts the {@link #mKeyboardView}. */
protected Activity mHostActivity;
/** Returns whether the CustomKeyboard is visible. */
public boolean isCustomKeyboardVisible() {
return mKeyboardView.getVisibility() == View.VISIBLE;
}
/**
* Make the CustomKeyboard visible, and hide the system keyboard for view v.
*/
public void showCustomKeyboard(View v) {
mKeyboardView.setVisibility(View.VISIBLE);
mKeyboardView.setEnabled(true);
if (v != null) {
InputMethodManager inputManager = (InputMethodManager) mHostActivity
.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
/** Make the CustomKeyboard invisible. */
public void hideCustomKeyboard() {
mKeyboardView.setVisibility(View.GONE);
mKeyboardView.setEnabled(false);
}
/**
* Register <var>EditText<var> with resource id <var>resid</var> (on the
* hosting activity) for using this custom keyboard.
*
* @param resid
* The resource id of the EditText that registers to the custom
* keyboard.
*/
public void registerEditText(int resid) {
EditText edittext = (EditText) mHostActivity.findViewById(resid);
edittext.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
showCustomKeyboard(v);
} else {
hideCustomKeyboard();
}
}
});
edittext.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showCustomKeyboard(v);
}
});
edittext.setInputType(edittext.getInputType()
| InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
}
}
Hiding the Soft Keyboard Programmatically You can force Android to hide the virtual keyboard using the InputMethodManager, calling hideSoftInputFromWindow, passing in the token of the window containing your edit field. This will force the keyboard to be hidden in all situations.
The soft keyboard (also called the onscreen keyboard) is the main input method on Android devices, and almost every Android developer needs to work with this component at some point.
Let's assume, we have an EditText and a Button in my layout. After click and writing in the edit field then clicking on the Button , we want to hide the virtual keyboard. You can use Android with the following statement: Keyboard. hide() .
Try to put the following condition in your InputMethodManager code before inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
line:
if (inputManager!=null) {
Activity activity = getActivity();
if (acvivity == null)
return;
if (activity.getCurrentFocus() == null)
return;
if (activity.getCurrentFocus().getWindowToken() == null)
return;
inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
I used it in ListFragment to hide the default keyboard. First when i press an EditText and keyboard is shown and when on onScrollStateChanged i hide it.
You can also try to put the InputMethodManager code inside the onClickListener of the EditText and then call your showCustomKeyboard() method.
Put an Else statement and Log in it after the if (v != null)
, maybe your View v
is null.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With