모바일 넥스젠의 주소 검색 기능

모바일 넥스젠(Mobile NexGen)은 안드로이드 기반의 GIS 솔루션으로써 기본적인 위치 검색 기능인 주소 검색 기능을 제공합니다. 한국의 주소 체계는 지번주소와 도로명주소를 혼용하고 있는데요. 모바일 넥스젠은 이 두가지 주소에 대한 검색 기능을 모두 제공합니다.

아래의 시연 동영상은 모바일 넥스젠에서 주소를 검색하는 기능에 대한 소개입니다.

주소 검색에 사용되는 DB는 로컬 DB를 기본적으로 사용함으로써 네트워크가 지원되지 않는 현장에서도 주소 검색 기능을 사용할 수 있습니다. 물론 네트워크를 통한 주소 검색도 가능하며 이는 저희 회사에서 개발한 공간서버의 지오코딩 서버와 연계하여 제공됩니다.

모바일 넥스젠(Mobile NexGen) 릴리즈

모바일 넥스젠은 안드로이드 환경에서 지도 중심의 현장 업무를 지원하고 처리할 수 있는 GIS 솔루션입니다. 공간 데이터 편집 및 위치 기반의 다양한 데이터를 현장에서 바로 취득할 수 있습니다. 수집 가능한 데이터의 형태는 이미지, 동영상와 같은 멀티미디어 뿐만 아니라 양식폼(Form)을 통해 다양한 형태의 속성값을 효과적으로 입력할 수 있습니다.

모바일 넥스젠은 TMS 방식의 인터넷 배경지도(VWorld, 네이버맵, 카카오맵), 공간서버를 통한 벡터 데이터는 물론 인터넷이 되지 않는 환경을 위해 파일 형태의 배경지도 및 벡터 데이터를 지도 데이터로 사용할 수 있으며 지도 표출 속도는 타사의 제품과 비교하여 상대적으로 매우 빠릅니다.

아래의 이미지는 모바일 넥스젠의 주요 기능을 파악할 수 있는 메뉴 UI 입니다.

또한 아래는 실행 화면을 통해 파악할 수 있는 주요 UI 구성입니다.

Drawer Menu 항목의 우측에 커스텀 뷰(Custom View) 달기

Drawer Menu는 안드로이드의 표준화된 메뉴입니다. 이 UI는 단순히 메뉴로써의 기능 뿐만이 아니라 다양한 정보를 사용자에게 제공할 수 있습니다. 이를 위해 Drawable의 특정 메뉴 항목의 우측에 커스텀 뷰를 달게 되면, 이 커스텀 뷰의 내용을 변경함으로써 어떤 정보를 사용자에게 전달할 수 있게 됩니다. 이 글은 이처럼 Drawable의 특정 메뉴 항목에 커스텀 뷰를 추가하는 코드를 정리합니다.

Drawer Menu를 추가하기 위해서는 Activity의 Layout에서 기본적으로 com.google.android.material.navigation.NavigationView를 사용하게 됩니다. 이를 NavigationView를 통해 메뉴의 각 항목에 접근할 수 있고, 접근된 메뉴에 원하는 View를 지정할 수 있게 됩니다. 아래 코드처럼요.

navigationView = findViewById<NavigationView>(R.id.main_navigation_view)

    ...

navigationView.getMenu().getItem(4).setActionView(R.layout.drawer_menu_item_collecting_data_searched_items_count)

위의 코드는 5번째 메뉴에 대한 커스텀 뷰를 R.layout.drawer_menu_item_collecting_data_searched_items_count으로 지정하고 있습니다. R.layout.drawer_menu_item_collecting_data_searched_items_count에 대한 코드는 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:orientation="vertical" >

    <TextView
        android:background="@drawable/rounding_box"
        android:id="@+id/tvResultItemCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ffffff"
        android:textSize="@dimen/very_small_text_size"
        android:paddingVertical="2dp"
        android:paddingHorizontal="10dp"
        android:text="0" />

</LinearLayout>

위의 뷰를 좀더 시각적으로 안정감 있도록 배경을 rounding_box라는 Drawable로 지정하였는데요. rounding_box 코드는 다음과 같습니다.

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/uiColor" />
    <padding
        android:left="45px"
        android:top="15px"
        android:right="45px"
        android:bottom="15px" />
    <corners android:radius="30px" />
</shape>

앞서 언급했던 것처럼 Drawer Menu의 항목에 대한 커스텀 뷰의 내용을 변경함으로써 정보를 사용자에게 전달한다고 했는데, 커스텀 뷰를 변경하는 코드의 예는 다음과 같습니다.

navigationView.getMenu().getItem(4).actionView.findViewById<TextView>(R.id.tvResultItemCount).text = "999"

Kotlin에서 propery 정의

field를 통해 내부 변수에 접근해야 한다는 점에 유의해야 함.

var state: State? = null
set(value) {
    field?.leave()
    field = value
    field?.enter()
}
get() = field