[boost course] DrawerLayout

2 분 소요

Drawer Layout

이번 프로젝트에서는 DrawerLayout을 사용했다. 햄버거 버튼을 누르면 왼쪽에서 튀어나오는 그것…오늘은 공홈에 대해 번역해 정리해 두도록 하겠다.

공홈DrawerLayout

DrawerLayout은 어느 한 쪽 (왼/오) 켠에서 “drawer” view가 끌어져 나오는 형태로서, 최상위 컨테이너로서 동작한다.

Drawer의 위치와 layout은 자식 view의 androud:layout_gravity attribute 에 따라 왼쪽 또는 오른쪽 (혹은 start/end, 버전에 따라)에서 나올 지 결정된다. 어느 한 쪽에만 drawer가 나올수 있다는 점을 기억하자. 양 쪽 벽에 drawer를 설정한다면, 런타임에서 exception이 발생할 것이다.

DrawerLayout을 사용하기 위해서는, 첫 번쨰 자식 객체인 primary content view의 width엔 height을 match_parent로 두고, layout_gravity는 설정하지 말자. Main content view이후에 drawer는 child view로서 Add하고 적절하게 layout_gravity를 설정하자. Drawer는 보통 height로 match_parent를 사용한다.

DrawerLayout.DrawerListener는 drawer view의 motion 상태를 모니터하기 위해 쓰인다. 애니메이션 도중에 리소스를 많이 소모하는 동작을 피하자. 끊길 수 있다. 소모값이 큰 동작은 STATE_IDEL 상태에서 행하자. DrawerLayout.DrawerListener는 각각의 callback method에서 default 또는 no-op implementations을 권한다.

안드로이드 디자인 가이드에 따르면, 왼쪽에 위치한 drawer는 앱을 둘러볼만한 컨텐츠를 가져야만 하고, 오른쪽에 나오는 것은 현재 위치의 정보에 대한 액션을 가져야 한다. 이러한 왼쪽-네비게이션, 오른쪽-액션 컨셉은 Action Bar와 같이 모든 곳에 적용할 수 있다.

더 많은 설명은 네비게이션 UI 만들기에서 볼 수 있다.

예시 code

<?xml version="1.0" encoding="utf-8"?>
<!-- Use DrawerLayout as root container for activity -->
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <!-- Layout to contain contents of main body of screen (drawer will slide over this) -->
    <fragment
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:id="@+id/nav_host_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph" />

    <!-- Container for contents of drawer - use NavigationView to make configuration easier -->
    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true" />

</android.support.v4.widget.DrawerLayout>
AppBarConfiguration appBarConfiguration =
        new AppBarConfiguration.Builder(navController.getGraph())
            .setDrawerLayout(drawerLayout)
            .build();
@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);

    ...

    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationView navView = findViewById(R.id.nav_view);
    NavigationUI.setupWithNavController(navView, navController);
}

댓글남기기