On Android devices that use soft keyboards, I want to prevent the fullscreen keyboard editing view (shown below) from appearing when in landscape mode (i.e. I want to see only the soft keyboard itself and my view behind it).
I assume this can be achieved using the setExtractViewShown(false)
method on InputMethodService
, but I am unable to access the default instance of this and do not want to implement a custom input method.
https://i.imgur.com/MB623.png
Edited to add: the view to which input is going is not a TextView
(it's a View
with a custom InputConnection
implementation), so android:imeOptions="flagNoExtractUi"
won't work here.
flagNoExtractUi
or IME_FLAG_NO_EXTRACT_UI
. However,in the documentation for IME_FLAG_NO_EXTRACT_UI
, which corresponds to flagNoExtractUi
, it states that "Using this flag is discouraged and it may become deprecated in the future", so flagNoFullscreen
is the recommended option.
I finally answered my own question:
The extract UI (i.e. the fullscreen editing mode) can be disabled at the point at which the input connection is hooked up:
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;
// etc.
}
To do that, navigate to activity xml and paste android:imeOptions="flagNoExtractUi"
in your code. But where should it be pasted? Have look at code of example activity xml and look at EditText:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<EditText
android:imeOptions="flagNoExtractUi"
android:id="@+id/etTextInAct"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
</LinearLayout>
If you want more customisation options for the keyboard see http://developer.android.com/guide/topics/ui/controls/text.html
EditorInfo.IME_FLAG_NO_EXTRACT_UI
suggests using IME_FLAG_NO_FULLSCREEN
instead.
add the property android:imeOptions="flagNoExtractUi"
to each EditText
in your XML
file.
The answer above helped me figure out the solution for dynamically added EditTexts:
editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Use android:imeOptions="flagNoFullscreen"
to achieve that feature.
IME_FLAG_NO_EXTRACT_UI
, which corresponds to flagNoExtractUi
, it states that "Using this flag is discouraged and it may become deprecated in the future", so flagNoFullscreen
is the recommended option.
Also, if you want to combine multiple imeOptions programaticaly, you can use the | syntax.
For example, in order to disable the fullscreen edit view in landscape and replace "Next" key by "OK" (ACTION_DONE) in keyboard, you can use:
editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
My solution:
android:imeOptions="flagNoExtractUi|flagNoFullscreen"
If you're modifying the IME directly you can prevent it from ever displaying an ExtractedView by overriding onUpdateExtractingVisibility
:
@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
super.onUpdateExtractingVisibility(ei);
}
I know it's a little bit late but for anyone who is still interested, here is my solution : In my case I had a landscape Activity containing an EditText at top of it and I needed to implement autocomplete feature in this search Activity, which the overlapping keyboard caused an issue that the user could not see result of RecyclerView. So I ended up having this EditText in my layout:
<EditText
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:id="@+id/main_search_et"
android:imeOptions="actionSearch|flagNoExtractUi"
android:inputType="text" />
Cheers!
You can use :
android:imeOptions="flagNoFullscreen"
in your edittext
You can call to hide soft keyboard and clear focus from searchview.
public void hideKeyboard(View view) {
InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
super.clearFocus();
Success story sharing
outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;