今回は基本中の基本のソフトウェアキーボードの操作についてまとめてみました。
キーボードを開く
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()にソフトキーボードに変化があった場合に通知が来ます。

0 件のコメント:
コメントを投稿