2012年1月20日

【Android】Soft Keyboardが表示されているかを知る

今回はSoft Keyboardが表示されているかどうかを検出するメソッドを作成しようと思います。

方法はいろいろあるのですが、
どれが正しく動くかは端末でやってみないと分かりません。
InputMethodManagerでやろうと思いましたが、
うまく動きませんでしたので、
別の方法で実装していきます。


まずはLinearLayoutをextendsして、
Layoutが変更した事を検出できるLayoutクラスを作成していきます。

package com.shonanshachu.layout;

import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.LinearLayout;

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

  public interface Listener {
    public void onSoftKeyboardChanged(boolean isShowing);
  }
 
  private Listener 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);
  }
}
このLayoutを使用して、XMLを書きます。
そして、Activityには、Listenerをimplementsします。

public class ActivityMain extends Activity implements LinearLayoutDetectsSoftKeyboard.Listener {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }

  @Override
  public void onSoftKeyboardChanged(boolean isShowing) {
    // do something here
  }
}
これで、onSoftKeyboardChangedでソフトキーボードが表示されているかどうかを知る事が出来ます。

では、引き続きプログラムを楽しんでくださいませ。