[Android] ListView의 선택 항목에 대한 하이라이팅(Hilighting) 또는 배경색 변경

안드로이드에서 ListView 위젯에 데이터 목록을 표시하고 사용자가 데이터 항목을 터치하면 어떤 항목이 터치가 되었는지에 대한 피드백이 있어야 합니다. 그러나 안드로이드에서는 기본적으로 이러한 피드백을 제공해 주지 않습니다. 이러한 피드백을 제공해주기 위한 절차입니다. 아래는 사용자가 항목을 터치했을 때 앞서 언급한 피드백에 대한 효과에 대한 이미지입니다.

먼저 ListView가 아래처럼 정의되어 있습니다. 항목 선택에 대한 피드백을 위해 특별히 해준 것은 없습니다.

...



...

ListView는 채워질 항목을 위한 레이아웃을 정의하게 되는데요. 이 레이아웃의 배경을 Selector로 지정하는게 키포인트입니다. 바로 아래처럼 말입니다.



    


위의 코드에서 중요한 것은 바로 3번 코드입니다. background를 selector_listview_item으로 지정하고 있는데, 이 selector_listview_item에 대한 XML 코드는 아래와 같습니다.


    
    

위의 코드에서 중요한 부분은 4번과 5번인데요. 5번에서 항목에 대한 상태가 만족될 경우, 즉 state_pressed가 참(true)일 경우에 4번 코드에서 지정한 Drawable를 이용해 그리라는 것입니다. 4번 코드에서 지정한 drawable인 ItemSelectedColor는 color.xml에 다음처럼 정의되어 있습니다.



    #8EE2FB

위의 코드 중 3번에서 지정한 웹 컬러 표현값인 #8EE2FB로 지정됩니다.

항목 선택하면 사용자에게 피드백을 주는 것이 당연한데, 안드로이드는 그렇지 않다는 점.. 분명히, 상당히 불편한 것이 틀림없지만.. 기능에 대한 넓은 확장성과 높은 응용성을 위해 이러한 방식을 취했다.. 생각합니다.

[Android] View의 Background에 라운딩 상자(Rounding Box) 넣기

View의 배경에 라운딩 박스를 넣어 UI를 깔끔하게 정리해야 할때가 있습니다. 대표적인 경우로, TextView에 단순히 문자열만을 표시하지 않고 라운딩 박스를 둘러 넣어 주면 뭔가 부족한 UI가 개선됨을 느낄 수 있습니다. 아래가 이러한 예에 대해 실제 적용한 화면입니다.

사용자 삽입 이미지

아래는 이처럼 View의 배경에 라운딩 박스를 넣기 위해 View의 background 속성을 지정한 xml 단 코드입니다.

<TextView 
    android:background="@drawable/bg_gis_result_items_count"
    android:id="@+id/tbResultItemCount"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:textColor="#ffffff"
    android:textSize="32px"
    android:layout_marginBottom="35px"
    android:layout_marginLeft="60px"
    android:layout_marginRight="120px"
    android:text="검색 결과 0 건" />

위의 코드를 보면, 라운딩 박스를 적용한 뷰는 TextView이고 배경을 지정하기 위해 android:background 속성에 @drawable/bg_gis_result_items_count를 지정하였습니다. 이제 이 @drawable/bg_gis_result_items_count의 코드를 보면 아래와 같습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid 
        android:color="#ffbacedd" />

    <padding 
        android:left="45px"
        android:top="15px"
        android:right="45px"
        android:bottom="15px" /> 

    <corners 
        android:radius="30px" /> 
</shape>

배경은 drawable 타입으로 지정할 수 있으며 라운딩 박스는 도형(shape)으로 지정합니다. 도형은 자신의 색상값을 지정할 수 있고 라운딩 처리는 이 도형의 corners를 통해 지정할 수 있습니다.