今日、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 件のコメント:
コメントを投稿