2012年10月2日

【Android】プログラムからキーボードの操作をする


今回は基本中の基本のソフトウェアキーボードの操作についてまとめてみました。



キーボードを開く

InputMethodManager imm
    = (InputMethodManager ) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, InputMethodManager.SHOW_FORCED);

キーボードを閉じる

InputMethodManager imm
    = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

ここまでは簡単な例です。
ここから多分実用的になってきます。

起動時にキーボードが開くのを防ぐ

EditText等をレイアウトに入れていると、起動時に自動でキーボードが開いてしまうことがあると思います。
それを防ぐには、onCreate()のsetContextView()の後で、
getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

キーボードが開いたのを検知する

キーボードが開いたかどうかをプログラム側で知りたい場合に利用します。
これは、LinearLayoutをextendsして、通知する為のListenerを登録します。
まずはLinearLayoutDetectsSoftKeyboard.javaを作成

public class LinearLayoutDetectsSoftKeyboard extends LinearLayout {
    /**
     * @param context
     * @param attrs
     */
    public LinearLayoutDetectsSoftKeyboard(Context context, AttributeSet attrs){
        super(context, attrs);
    }

    public interface Listener {
        /**
         * @param isOpen whether soft keyboard is open
         */
        public void onSoftKeyboardChanged(boolean isOpen);
    }

    private Listener listener;

    /**
     * @param listener LinearLayoutDetectsSoftKeyboard.Listener
     */
    public void setListener(Listener listener){
        this.listener = listener;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        if(listener != null){
            int height = MeasureSpec.getSize(heightMeasureSpec);
            Activity activity = (Activity) getContext();
            Rect rect = new Rect();
            activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
            int statusBarHeight = rect.top;
            int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
            int diff = (screenHeight - statusBarHeight) - height;
            listener.onSoftKeyboardChanged(diff > 128);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

起動時にListenerを登録します。
public class MyActivity extends Activity implements LinearLayoutDetectsSoftKeyboard.Listener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        setContentView(R.layout.main);

        ((LinearLayoutDetectsSoftKeyboard)findViewById(R.id.main_layout))
            .setListener(this);
    }

    @Override
    public void onSoftKeyboardChanged(boolean isOpen) {
        // TODO: do something here
    }
}

これでonSoftKeyboardChanged()にソフトキーボードに変化があった場合に通知が来ます。