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

前端 未结 3 1880
孤城傲影
孤城傲影 2020-12-18 22:12

My app opens the input method picker (the menu where you choose a keyboard) with InputMethodManager.showInputMethodPicker(). My app doesn\'t actually create the

相关标签:
3条回答
  • 2020-12-18 22:51

    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();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-18 23:05

    Here is a small trick. Please do test it and let us know if it works.

    All you have to do is make your activity extend this InputMethodActivity. When you need the user to pick input method, call pickInput(), and onInputMethodPicked() will be called when the user is done.

    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;
        }
    }
    
    0 讨论(0)
  • 2020-12-18 23:15

    Simple you can know by using buildin function:

     @Override
            public void onWindowFocusChanged(boolean hasFocus) {
                super.onWindowFocusChanged(hasFocus);
                isMyInputMethodEnabled();// write what ever you want to do after default keyboard selected
            }
    
    
      public void isMyInputMethodEnabled() {
            String imId = Settings.Secure.getString(getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
            if (imId.contains(getPackageName())) {
                startActivity(new Intent(this, Main_uk.class));
                finish();
            }
        }
    
    0 讨论(0)
提交回复
热议问题