How can I determine if the input method selection is open or closed?

In my application, the input selection method opens (the menu in which you select the keyboard) with InputMethodManager.showInputMethodPicker() . My application does not actually create a collector (it was created by InputMethodManager), but I know that it is ContextMenu and its identifier is R.id.switchInputMethod .

enter image description here

The collector is part of a multi-stage wizard, so I need to know when the collector closes, so my application can continue to the next step. Now I am checking the background thread if the default keyboard has changed, but this does not help if the user selects the same keyboard or presses back.

So, I need to specify when the collector closes (or some other smart way to find out when to proceed).

Thanks in advance...

+7
source share
2 answers

There is no such mechanism for checking InputMethodPicker open or not.

But you can check it in another way, as when using the hasWindowFocus() method to check the focus of your root layout.

The following is sample code:

main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mainlayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/btnPicker" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Picker" /> <Button android:id="@+id/btnCheck" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop" /> </LinearLayout> 

DemoappActivity.class

 public class DemoappActivity extends Activity { /** Called when the activity is first created. */ Button btn1 , btn2; InputMethodManager imeManager; LinearLayout mLayoutRoot; TimerTask timertask; Timer timer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mLayoutRoot = (LinearLayout)findViewById(R.id.mainlayout); imeManager = (InputMethodManager) getApplicationContext().getSystemService(INPUT_METHOD_SERVICE); btn1 = (Button)findViewById(R.id.btnPicker); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showInputMethodPicker(); } }); btn2 = (Button)findViewById(R.id.btnCheck); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { timer.cancel(); } }); checkMyWindowHasFocus(); } @Override protected void onDestroy() { timer.cancel(); super.onDestroy(); } public void checkMyWindowHasFocus() { timertask = new TimerTask() { @Override public void run() { System.out.println("has window focus..."+mLayoutRoot.hasWindowFocus()); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Has focus "+mLayoutRoot.hasWindowFocus(), Toast.LENGTH_SHORT).show(); } }); } }; timer = new Timer(); timer.schedule(timertask, 500, 5000); } private void showInputMethodPicker() { if (imeManager != null) { imeManager.showInputMethodPicker(); } else { Toast.makeText(this, "Error",Toast.LENGTH_LONG).show(); } } } 
+3
source

Here is a little trick. Please check it and let us know if it works.

All you have to do is increase the activity of this InputMethodActivity. When you need a user to select an input method, call pickInput () , and onInputMethodPicked () will be called when the user is executed.

 package mobi.sherif.inputchangecheck; import android.os.Bundle; import android.os.Handler; import android.content.Context; import android.support.v4.app.FragmentActivity; import android.view.inputmethod.InputMethodManager; public abstract class InputMethodActivity extends FragmentActivity { protected abstract void onInputMethodPicked(); @Override protected void onCreate(Bundle savedInstanceState) { mState = NONE; super.onCreate(savedInstanceState); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(mState == PICKING) { mState = CHOSEN; } else if(mState == CHOSEN) { onInputMethodPicked(); } } private static final int NONE = 0; private static final int PICKING = 1; private static final int CHOSEN = 2; private int mState; protected final void pickInput() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showInputMethodPicker(); mState = PICKING; } } 
+10
source

All Articles