본문 바로가기

Android

EditText Scrollable

Multiline EditText

 

Title을 입력 받는 EditText와 다르게 Description는 여러 줄의 내용을 입력받을 수 있다.

하지만 EditText의 Height를 무한히 늘일 수 없기 때문에 5줄의 내용만 보여지도록 제한시켜놓았다.

 

만약 장문을 입력한다고 했을때 화면에서 보여지는 이전 내용을 수정하기 위해서는 여타 다른 에디터처럼 스크롤해서 윗부분으로 커서를 이동시킬 수 있어야한다.

 

 

에디트텍스트의 멀티라인 적용 그리고 스크롤적용 코드는 간단하다.

<EditText
    android:maxLines="5"
    android:scrollbar="vertical" />

 

두 가지 옵션값으로 간단하게 지정할 수 있다.

 

## android:lines="5" 그리고 android:maxLines="5"의 차이점.

lines="5"의 경우 EditText의 기본 높이가 5줄에 고정된다. 아무런 내용이 없을 때에도 5줄을 차지한다.
그리고 내용이 5줄을 넘어갈 경우 높이가 계속해서 늘어나게 된다.

 

maxLines="5"의 경우 내용이 없을 경우 EditText의 높이는 1이다. 하지만 내용의 줄이 늘어날 수록 높이가 늘어나는데.
최대 5줄까지 높이가 늘어난다. 5줄보다 많은 내용을 입력했을 경우 보여지는 최대 높이는 5줄크기이며 스크롤이 가능하게 된다.

# 문제점. NestedScrollView 내에 속한 EditText

위와 같이 간단한 옵션값으로 EditText의 스크롤바는 적용할 수 있지만 현재 사용하고 있는 구조에서는 스크롤이 작동하지 않았다.

 

그 이유는 NestScrollView가 EditText를 감싸고 있는 구조이기 때문이다.

<NestedScrollView
                  app:layout_behavior="@string/appbar_scrolling_view_behavior">
   <EditText/>
</NestedScrollView>

NestedScrollView가 더 외부에 위치하며 Scroll을 위한 Touch Action을 소비한다.
그러므로 EditText의 스크롤이 적용되지 않는 문제가 발생했다.

이 문제를 해결하기 위해서는 EditText가 Touch Action을 소비할 수 있도록 만들어줘야한다.

# CustomEditText 만들기

스크롤뷰 내부에서도 EditText가 Touch를 감지할 수 있도록 기능을 추가한 CustomEditText를 생성한다.

class CustomEditText extends TextInputEditText

@Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        getParent().requestDisallowInterceptTouchEvent(true);
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_UP:
                getParent().requestDisallowInterceptTouchEvent(false);
                performClick();
                break;
        }

        return true;
    }

onTouchEvent 메소드를 오버라이드해서 에디트 텍스트에 대한 터치에 한에서 부모(스크롤뷰)의 Touch Event를 가로채오도록(Intercept) 구현한다.

위 방법으로 스크롤뷰 내에 위치한 EditText의 스크롤을 정상작동시키는 커스텀 에디트텍스트를 만들 수 있다.

# 느낀점

구현할수록 뷰의 계층구조가 어떻게 디자인 되어있는지가 중요한 것 같다.
그리고 스크롤뷰 등 기능이 복잡한 레이아웃이 많이 사용될수록 새로운 기능을 추가하거나 수정할때 복잡한 수정이 필요해진다.

 

UX를 위해서 반드시 필요한 지점이 아니라면 스크롤뷰의 사용을 배제하고 구현할 수 있는 방법을 찾는 것이 좋은 방법일 수 있다.

 

생각한대로 기능이 동작하지 않을때 XML를 보고 어떤 컴포넌트가 Touch Event를 가져가는지 체크해보자.

앞선 Drawer - Toolbar 관계에서도 그렇지만 유저에게 보여지는 화면은 평면적이지만
실제 동작은 계층적으로 구현된 어느 파트에서 어떤 우선순위로 동작을 수행하는지 잘 생각해보면서 개발을 진행해야겠다.

'Android' 카테고리의 다른 글

Reminder 기능 구현하기  (0) 2019.11.24
Logic 분리하기  (0) 2019.11.01
자동 Keypad 보여주기  (0) 2019.10.25
NavIndicator와 NavigationUp  (0) 2019.10.25
FloatingActionButton Anchor to Appbar  (0) 2019.10.08