Android EditText를 사용할 때 IME의 Key Event 및 EditorAction(ViewPager에서 사용할 때 고려 사항)

ViewPager에 EditText 등을 표시하고 IME가 나타나는 상태에서 특정 버튼을 눌러 페이지를 전환합니다.이렇게 되면

KeyEvent


① 및 ② Arrow 아이콘의 버튼은 TextView에서 다음 이벤트를 발행합니다.
Event property 
Value
Value
ActionKeyEvent.ACTION_DOWN KeyEvent.UPKeyCodeKeyEvent.KEYCODE_DPAD_LEFT KeyEvent.KEYCODE_DPAD_RIGHT따라서 사건을 이렇게 처리할 수 있다.
        binding.editText.setOnKeyListener { _, _, event ->          
            if (event.action != KeyEvent.ACTION_DOWN) {
                return@setOnKeyListener false
            }            
            return@setOnKeyListener when (event.keyCode) {
                KeyEvent.KEYCODE_DPAD_LEFT -> {
                    // handle when Push left arrow icon button.
                    false
                }
                KeyEvent.KEYCODE_DPAD_RIGHT -> {
                    // handle when Push right arrow icon button.
                    false
                }
                else -> {
                    true
                }
            }
        }

EditorAction


③ 동작을 하고 싶을 때 사용EditorActionListener

        binding.editText.setOnEditorActionListener { _, actionId, _ ->
            return@setOnEditorActionListener when(actionId) {
                EditorInfo.IME_ACTION_DONE -> {
                    // Handle when pushed done button(right bottom)
                     true    
                }
                else -> {                   
                    false
                }                
            }
        }
파라미터가 이 사건을 따로 전파할 지 여부입니다.true를 통해 전파될 경우 Focus는 다음 Focuusable View로 이동합니다.

오른쪽 아래 아이콘은 할 수 있는 모양입니다.
지정하려는 경우android:imeOptions="send"처럼.
https://developer.android.com/reference/android/view/inputmethod/EditorInfo#imeOptions

ViewPager에서 사용할 때 고려 사항


여기 반했어...
ViewParger는 페이지 전환에 KeyEvent Intercept를 사용합니다.
따라서 ViewPager에 EditText를 표시하고 IME를 표시한 상태에서 좌우 ① 또는 ②의 단추를 눌렀을 때 페이지 전환


    /**
     * You can call this function yourself to have the scroll view perform
     * scrolling from a key event, just as if the event had been dispatched to
     * it by the view hierarchy.
     *
     * @param event The key event to execute.
     * @return Return true if the event was handled, else false.
     */
    public boolean executeKeyEvent(@NonNull KeyEvent event) {
        boolean handled = false;
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            switch (event.getKeyCode()) {
                case KeyEvent.KEYCODE_DPAD_LEFT:
                    if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
                        handled = pageLeft();
                    } else {
                        handled = arrowScroll(FOCUS_LEFT);
                    }
                    break;
                case KeyEvent.KEYCODE_DPAD_RIGHT:
                    if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
                        handled = pageRight();
                    } else {
                        handled = arrowScroll(FOCUS_RIGHT);
                    }
                    break;
                case KeyEvent.KEYCODE_TAB:
                    if (event.hasNoModifiers()) {
                        handled = arrowScroll(FOCUS_FORWARD);
                    } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
                        handled = arrowScroll(FOCUS_BACKWARD);
                    }
                    break;
            }
        }
        return handled;
    }


전환하지 않으려면 반환값setOnKeyListener이 가짜 방식으로 전파되지 않습니다.

좋은 웹페이지 즐겨찾기