2015年4月28日火曜日

ViewPagerの中のEditTextでカーソルを移動したときにページが変わってしまうことの対策方法

はじめまして、イトナブ石巻に今月入社しましたデルシオです。

今日、ViewPagerを使っていて、ページの中にEditTextを入れたのですが、困ったことにEditTextのカーソルが端にあるときに、カーソルを動かそうとするとページが変わってしまうという現象が起こりました。調べても出てこなかったので、ここにまとめたいと思います。

まず、EditTextのOnKeyListenerを下のように定義します。
public class OnKeyDownDisablePageChange implements EditText.OnKeyListener {
 @Override
 public boolean onKey(View v, int keyCode, KeyEvent event) {
  switch (keyCode) {
   case (KeyEvent.KEYCODE_DPAD_LEFT):
    // ←ボタンが押されたら
    if (mEditMemo.getSelectionEnd() == 0) {
     // 選択範囲の終わり(カーソルも含む)が左端だったら
     return true;
     // その他のonKeyの動作を無効にする(ページが変わらない)
    }
    break;
   case (KeyEvent.KEYCODE_DPAD_RIGHT):
    // →ボタンが押されたら
    int length = ((EditText) v).getText().length();
    if (mEditMemo.getSelectionStart() == length) {
     // 選択範囲の始まり(カーソルも含む)が右端だったら
     return true;
     // その他のonKeyの動作を無効にする(ページが変わらない)
    }
    break;
  }
  return false;
  // なにもない場合はカーソルを移動する
 }
}
こうすることで、カーソルが端から出ようとするとき(ViewPagerにページを変える通知を送るとき)の動作を無効にしています。
そしてViewPagerのページのFragmentの中で
OnKeyDownDisablePageChange mOnKeyDownDisablePageChange = new OnKeyDownDisablePageChange();
のように定義して
mEditText.setOnKeyListener(mOnKeyDownDisablePageChange);
などとEditTextのsetOnKeyListenerを使って適用させれば良いと思います。

0 件のコメント:

コメントを投稿