androidandroid-input-methodandroid-contextmenu

How can I tell if the input method picker is open or closed?


My app opens the input method picker (the menu where you choose a keyboard) with InputMethodManager.showInputMethodPicker(). My app doesn't actually create the picker (it's created by InputMethodManager) but I know it's a ContextMenu and its id is R.id.switchInputMethod.

enter image description here

The picker is part of a multi-step wizard so I need to know when the picker closes so my app can proceed to the next step. Right now I'm checking in a background thread if the default keyboard changed, but that doesn't help if the user selects the same keyboard or presses back.

So I need a way to tell when the picker closes (or some other clever way to know when to proceed).

Thanks in advance...


Solution

  • There is no such mechanism for check InputMethodPicker is open or not.

    But you can check it via another way like as using hasWindowFocus() method for check has focus of your root layout.

    Below 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();
            }
        }
    }