[android] design support library
https://android-developers.googleblog.com/2015/05/android-design-support-library.html
-
android design support library 를 통해서 navigation drawer view, floating labels for editing text, floating action button, snackbar, tabs, motion & scroll framework 등을 2.1 이상 버전에서 사용 가능하다.
-
gradle 에 아래를 추가하자!
compile 'com.android.support:design:22.2.0'
이 녀석은 Support v4 와 AppCompat Support Libraries 에 dependency 가 있어 그것들은 자동으로 추가된다.
Navigation View
https://developer.android.com/reference/android/support/design/widget/NavigationView.html
-
Navigation View 는 navigation drawer 와 함께 쓰이며, menu resource 를 inflate 하는 것을 도와주는 녀석
-
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<!-- your content layout -->
<android.support.design.widget.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/drawer"/>
</android.support.v4.widget.DrawerLayout>
-
app:headerLayout 은 header part 를 구성하는 layout
app:menu 는 menu 를 구성하는 xml
-
drawer menu 는 다음과 같은 형태로 구성된다.
<group android:checkableBehavior="single">
<item
android:id="@+id/navigation_item_1"
android:checked="true"
android:icon="@drawable/ic_android"
android:title="@string/navigation_item_1"/>
<item
android:id="@+id/navigation_item_2"
android:icon="@drawable/ic_android"
android:title="@string/navigation_item_2"/>
</group>
android:checked=“true” 로 마킹되면 highlight 되어 나온다.
-
subheader 를 두려면 아래와 같이 메뉴를 구성한다.
<item
android:id="@+id/navigation_subheader"
android:title="@string/navigation_subheader">
<menu>
<item
android:id="@+id/navigation_sub_item_1"
android:icon="@drawable/ic_android"
android:title="@string/navigation_sub_item_1"/>
<item
android:id="@+id/navigation_sub_item_2"
android:icon="@drawable/ic_android"
android:title="@string/navigation_sub_item_2"/>
</menu>
</item>
-
item 이 선택되었을 때는 OnNavigationItemSelectedListener 를 통해 callback 을 받을 수 있다.
이 callback 은 MenuItem 이 인자로 전달된다.
setNavigationItemSelectedListener() 를 통해 Listener 를 설정한다.
Floating labels for editing text
https://developer.android.com/reference/android/support/design/widget/TextInputLayout.html
-
TextInputLayout 을 통해서 hint text 를 floating label 로 만들 수 있다.
-
아래와 같이 wrap 을 하기만 하면 자동으로 hint 적용된다.
<android.support.design.widget.TextInputLayout
android:id="@+id/fNameLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/imageView"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp">
<EditText
android:id="@+id/fName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="First Name"/>
</android.support.design.widget.TextInputLayout>
Floating Action Button
-
floating action button 은 theme 에 설정된 colorAccent 값을 색상으로 해서 일관된 design 을 적용할 수 있도록 해준다.
-
fabSize=“mini” 를 통해서 작은 FAB 를 제공할 수도 있다.
-
FAB 는 ImageView 를 상속한 녀석으로 android:src 나 setImageDrawable() 등을 통해서 이미지를 설정할 수도 있다.
Snackbar
https://www.google.com/design/spec/components/snackbars-toasts.html
-
가벼운 피드백을 주는 목적이라면 snackbar 를 쓰기에 좋다.
snackbar 는 바닥부분에서 나오는 녀석으로 text 와 optional single action 을 갖는다.
-
이 녀석은 toast 처럼 약간의 시간이 지나면 자동적으로 사라진다.
덧붙여 유저가 swipe 로 제거할 수도 있다.
-
single action 을 줄 수도 있고, swipe 에 대한 처리도 할 필요가 있다면,
snackbar 가 역시나 최적의 선택이다.
사용법도 toast 와 매우 비슷하다.
Snackbar
.make(parentLayout, R.string.snackbar_text, Snackbar.LENGTH_LONG)
.setAction(R.string.snackbar_action, myOnClickListener)
.show(); // Don’t forget to show!
Tabs
https://material.io/guidelines/components/tabs.html
-
TabLayout 을 사용하여 쉽게 구현할 수 있다.
같은 넓이를 가진 fixed width tab 을 만들 수 있고, tab 부분이 scroll 되도록도 할 수 있다.
-
아래 코드처럼 코드로 넣을 수 있다.
TabLayout tabLayout = …;
tabLayout.addTab(tabLayout.newTab().setText(“Tab 1”));
-
만약 ViewPager 와 함께 사용된다면, PagerAdapter 의 getPageTitle 과 setupWithViewPager 함수들을 이용하여 둘을 쉽게 연동시킬 수 있다.
CoordinatorLayout, motion, and scrolling
https://developer.android.com/reference/android/support/design/widget/CoordinatorLayout.html
-
CoordinatorLayout 은 기존의 단순 touch event 를 넘어서는 추가적인 control 을 제공한다.
어떤 녀석인지 감을 잡고 싶다면 https://material.io/guidelines/patterns/scrolling-techniques.html 를 참조
-
이 녀석은 FrameLayout 을 상속한 녀석으로, ref doc 에 따라면 “super-powered” 란다.
-
Behaviors 를 설정함으로서 single parent 와 child 들에 대한 interaction 들을 쉽게 정의할 수 있다.
-
FloatingActionButton 을 CoordinatorLayout 의 child 로 설정해 놓고,
CoordinatorLayout 을 Snackbar.make() 에 전달하면
snackbar 가 FAB 를 위로 자동으로 밀어주며 등장한다.
다른 코드는 필요 없다. android 3.0 이상이라면
-
layout_anchor 나 layout_anchorGravity 를 이용하여 floating 되어 있는 view 들에 대해 다른 view 들과 상대성을 갖게 할 수 있다.
-
AppBarLayout, Toolbar 등을 이용하면 손쉽게 scroll 에 동기화하여 tab, toolbar 등을 control 할 수 있다.
( https://developer.android.com/reference/android/support/design/widget/AppBarLayout.html )
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<! -- Your Scrollable View -->
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
...
app:layout_scrollFlags="scroll|enterAlways">
<android.support.design.widget.TabLayout
...
app:layout_scrollFlags="scroll|enterAlways">
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
위와 같이 layout 을 구성하면, RecyclerView 가 scroll 이 되면 AppBarLayout 이 respond 를 하며 children 으로 들어간 녀석들의 scroll flag 들을 참조하여 action 을 한다.
-
AppBarLayout의 child 에 들어갈 수 있는 flag 속성은..
app:layout_scrollFlags 를 통해 설정하며, 아래 값들이 | operation 되어 assign 될 수 있다.
scroll : scroll 되어 off screen 될 수 있다. 이 flag 를 사용하지 않으면 top 에 pin 된다.
enterAlways : downward scroll 이 visible 하게 만들어준다. quick return pattern 이 사용된다.
enterAlwaysCollapsed : minHeight 가 view 에 설정되어 있다면 minimum height 로 등장을 한다. 그리고 scroll 이 top 에 달했을 때에만 full height 로 작동한다.
exitUntilCollapsed : view 가 exit 하기 전에 collapsed ( minHeight ) 상태로 존재하게 한다.
scroll 을 사용하는 모든 view 들은 이를 사용하지 않는 view 들보다 먼저 선언되어야 한다.
그래야 fixed element 들 뒤로 자연스럽게 사라진다.
-
AppBarLayout 에 Toolbar 를 바로 추가해주면 enterAlwaysCollapsed | exitUntilCollapsed scroll flag 가 setting 된다.
그래서 detail control 이 어려울 수 있는데 이 때는 CollapsingToolBarLayout 을 사용해주면 된다.
https://developer.android.com/reference/android/support/design/widget/CollapsingToolbarLayout.html
<android.support.design.widget.AppBarLayout
android:layout_height="192dp"
android:layout_width="match_parent">
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<android.support.v7.widget.Toolbar
android:layout_height="?attr/actionBarSize"
android:layout_width="match_parent"
app:layout_collapseMode="pin"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
app:layout_collapseMode=“pin” 을 주어 Toolbar 가 top 에 pin 되도록 할 수 있다.
CollapsingToolbarLayout 을 사용하면 tollbar 가 fully visible 한 상황에서 자연스럽게 글씨도 커진다.
반대로 collapse 할 때 작아진다.
-
app:layout_collapseMode=“parallax” 로도 사용 가능하고,
app:layout_collapseParallaxMultiplier=“0.7” 등으로 parallax multiplier 값을 설정할 수도 있다.
이 값들은 app:contentScrim=“?attr/colorPrimary” 값을 CollapsingToolbarLayout 에 넣었을 때 아주 훌륭하게 작동한다.
collapse 될 때 알아서 잘 scrim 시켜준다. ( scrim 은 빛을 연하게 만드는 작업 )
-
CoordinatorLayout 은 Coordinator.Behavior 와 연동하여 child view 에 대한 더 많은 touch control, gesture control 들을 할 수 있다.
이에 대한 callback 은 onDependentViewChanged() 를 통해 전달된다.
CoodinatorLayout.DefaultBehavior(YourView.Behavior.class) annotation 을 통해 정의할 수 있고,
app:layout_behavior=“com.example.app.YourView$Behavior” 를 통해서도 설정할 수 있다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] Play Store 에 대한 미신 (0) | 2017.08.06 |
---|---|
[android] ListView scroll 할 때 Toolbar 감추기 (0) | 2017.08.05 |
[android] Nice 한 UI 를 만드는 규칙~ (0) | 2017.08.03 |
[android] 추가된 유용한 annotations (2) | 2017.08.02 |
[android] VSYNC 가 뭐하는 녀석인지 간단히 이야기하면? (0) | 2017.08.01 |
댓글