수색…


소개

Material Design은 플랫폼과 장치 전반에 걸쳐 시각적, 동작 및 상호 작용 설계를위한 포괄적 인 안내서입니다.

비고

디자인 지원 라이브러리를 소개하는 원래 Android 블로그 게시물을 참조하십시오.

공식 문서

https://developer.android.com/design/material/index.html

재료 설계 지침

https://material.io/guidelines

기타 디자인 리소스 및 라이브러리

https://design.google.com/resources/

AppCompat 테마 적용

AppCompat 지원 라이브러리는 Material Design 사양으로 응용 프로그램을 빌드하기위한 테마를 제공합니다. Theme.AppCompat 의 부모가있는 테마는 Activity가 AppCompatActivity 를 확장하는 데 필요합니다.

첫 번째 단계는 테마의 색상 팔레트 를 사용자 정의하여 응용 프로그램을 자동으로 채색하는 것입니다.
앱의 res/styles.xml 다음을 정의 할 수 있습니다.

<!-- inherit from the AppCompat theme -->
<style name="AppTheme" parent="Theme.AppCompat">

    <!-- your app branding color for the app bar -->
    <item name="colorPrimary">#2196f3</item>
    
    <!-- darker variant for the status bar and contextual app bars -->
    <item name="colorPrimaryDark">#1976d2</item>

    <!-- theme UI controls like checkboxes and text fields -->
    <item name="colorAccent">#f44336</item>
</style>

어두운 배경이있는 Theme.AppCompat 대신 Theme.AppCompat.Light 또는 Theme.AppCompat.Light.DarkActionBar 사용할 수도 있습니다.

자신 만의 색상으로 테마를 사용자 정의 할 수 있습니다. Material design specification color chartMaterial Palette 에서 좋은 선택이 가능합니다. "500"색상은 기본 (이 예에서는 파란색 500)에 적합합니다. 어두운 색에 대해 동일한 색조의 "700"을 선택하십시오. 악센트 색상과 다른 색상의 음영이 있습니다. 기본 색상은 앱 툴바 및 개요 (최근 앱) 화면의 항목, 상태 막대의 색조가 진한 변형 및 일부 컨트롤을 강조 표시하는 강조 색상으로 사용됩니다.

이 테마를 만든 후에 AndroidManifest.xml 에서 앱에 적용하고 특정 활동에 테마를 적용합니다. 이 기능은 AppTheme.NoActionBar 테마를 적용 할 AppTheme.NoActionBar 유용합니다.이 테마를 사용하면 기본 도구 모음이 아닌 구성을 구현할 수 있습니다.

<application android:theme="@style/AppTheme" 
    ...>
    <activity 
        android:name=".MainActivity"
        android:theme="@style/AppTheme" />
</application>

android:themeThemeOverlay 테마를 사용하여 개별보기에 테마를 적용 할 수도 있습니다. 예를 들어 Toolbar :

<android.support.v7.widget.Toolbar
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="?attr/colorPrimary"
  android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

또는 Button :

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:theme="@style/MyButtonTheme"/>

<!-- res/values/themes.xml -->
<style name="MyButtonTheme" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">@color/my_color</item>
</style>

툴바 추가하기

Toolbar 는 애플리케이션 레이아웃 내에서 사용하기 위해 ActionBar 를 일반화 한 것입니다. ActionBar 는 전통적으로 프레임 워크에 의해 제어되는 Activity's 불투명 한 윈도우 장식 Activity's 일부분이지만 Toolbar 는 뷰 계층 구조 내의 임의의 중첩 수준에 배치 될 수 있습니다. 다음 단계를 수행하여 추가 할 수 있습니다.

  1. 종속성에 따라 모듈의 (예 : app의) build.gradle 파일에 다음 종속성이 추가되었는지 확인하십시오.

    compile 'com.android.support:appcompat-v7:25.3.1'
    
  2. 앱의 테마를 ActionBar없는 테마로 설정합니다. 이를 위해 res/values 에서 styles.xml 파일을 편집하고 Theme.AppCompat 테마를 설정하십시오.
    이 예에서 우리가 사용하는 Theme.AppCompat.NoActionBar 당신의 부모 AppTheme :

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primaryDark</item>
        <item name="colorAccent">@color/accent</item>
    </style>
    

    Theme.AppCompat.Light.NoActionBar 또는 Theme.AppCompat.DayNight.NoActionBar 또는 본질적으로 ActionBar 가없는 다른 테마를 사용할 수도 있습니다

  1. 활동 레이아웃에 Toolbar 추가 :

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:elevation="4dp"/>
    

    Toolbar 아래에서 나머지 레이아웃을 추가 할 수 있습니다.

  1. Activity 에서 Toolbar 를이 ActivityActionBar 로 설정하십시오. appcompat 라이브러리AppCompatActivity 를 사용하는 경우 setSupportActionBar() 메서드를 사용합니다.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
     
        //...
    } 
    

위의 단계를 수행 한 후 getSupportActionBar() 메서드를 사용하여 ActionBar 로 설정된 Toolbar 를 조작 할 수 있습니다.

예를 들어 아래와 같이 제목을 설정할 수 있습니다.

getSupportActionBar().setTitle("Activity Title");

예를 들어 제목과 배경색을 아래와 같이 설정할 수도 있습니다.

CharSequence title = "Your App Name";
SpannableString s = new SpannableString(title);
s.setSpan(new ForegroundColorSpan(Color.RED), 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
getSupportActionBar().setTitle(s);
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.argb(128, 0, 0, 0)));

FloatingActionButton 추가하기 (FAB)

머티리얼 디자인에서 플로팅 액션 버튼 은 액티비티의 기본 액션을 나타냅니다.
그것들은 UI 위를 떠 다니는 동그라미 모양의 아이콘으로 구별되며 모핑, 실행 및 앵커 포인트 전송과 같은 동작 동작을 포함합니다.

종속성에 따라 앱의 build.gradle 파일에 다음 종속성이 추가되었는지 확인하십시오.

compile 'com.android.support:design:25.3.1'

이제 FloatingActionButton 을 레이아웃 파일에 추가합니다.

<android.support.design.widget.FloatingActionButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_margin="16dp"
      android:src="@drawable/some_icon"/>

여기서 src 속성은 부동 조치에 사용해야하는 아이콘을 참조합니다.
결과는 다음과 같아야합니다 (액센트 색상을 소재 핑크라고 가정). 자재 FAB

기본적으로 FloatingActionButton 배경색은 테마의 액센트 색상으로 설정됩니다. 또한 FloatingActionButton 은 제대로 작동하려면 주위에 여백이 필요합니다. 아래의 권장 마진은 16dp 전화와에 대한 24dp 태블릿.

다음은 FloatingActionButton 추가로 사용자 정의하는 데 사용할 수있는 속성입니다 ( xmlns:app="http://schemas.android.com/apk/res-auto 가 네임 스페이스로 레이아웃 상단으로 선언 된 것으로 가정).

  • app:fabSize : 일반 크기 또는 작은 크기로 전환하려면 normal 또는 mini 로 설정할 수 있습니다.
  • app:rippleColor : FloatingActionButton 의 파급 효과 색상을 설정합니다. 색상 자원 또는 16 진수 문자열이 될 수 있습니다.
  • app:elevation : 문자열, 정수, 부울 값, 색상 값, 부동 소수점, 치수 값이 될 수 있습니다.
  • app:useCompatPadding : compat 패딩을 사용합니다. true 또는 false 와 같은 부울 값 일 수 있습니다. api-21 이상에서 compat 패딩을 사용하려면 true 로 설정하여 이전 API 수준에서 일관된 모양을 유지합니다.

여기에서 FAB에 대한 더 많은 예제를 찾을 수 있습니다.

머티리얼 디자인 스타일의 버튼

AppCompat Support Library버튼 에 대한 몇 가지 유용한 스타일을 정의합니다. 각 스타일은 AppCompat 테마를 사용하는 경우 기본적으로 모든 버튼에 적용되는 기본 Widget.AppCompat.Button 스타일을 확장합니다. 이 스타일은 Material Design 사양에 따라 모든 버튼이 기본적으로 동일하게 보이도록합니다.

이 경우 액센트 색상은 분홍색입니다.

  1. 간단한 버튼 : @style/Widget.AppCompat.Button

    간단한 버튼 이미지

    <Button
        style="@style/Widget.AppCompat.Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp" 
        android:text="@string/simple_button"/>
    
  1. 컬러 버튼 : @style/Widget.AppCompat.Button.Colored
    Widget.AppCompat.Button.Colored 스타일은 확장 Widget.AppCompat.Button 스타일을 자동으로 앱 테마에서 선택한 악센트 색상을 적용합니다.

    컬러 버튼 이미지

    <Button
        style="@style/Widget.AppCompat.Button.Colored"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp" 
        android:text="@string/colored_button"/>
    

    기본 테마 의 강조 색상을 변경하지 않고 배경 색상을 사용자 정의하려면 ButtonCustom 테마 ( ThemeOverlay 테마 확장)를 만들고 버튼의 android:theme 속성에 할당합니다.

    <Button  
         style="@style/Widget.AppCompat.Button.Colored"  
         android:layout_width="wrap_content"  
         android:layout_height="wrap_content" 
         android:layout_margin="16dp"
         android:theme="@style/MyButtonTheme"/> 
    

    res/values/themes.xml 테마를 정의하십시오.

     <style name="MyButtonTheme" parent="ThemeOverlay.AppCompat.Light"> 
          <item name="colorAccent">@color/my_color</item> 
     </style>
    
  2. 테두리없는 단추 : @style/Widget.AppCompat.Button.Borderless

    여백없는 단추 이미지

    <Button
        style="@style/Widget.AppCompat.Button.Borderless"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp" 
        android:text="@string/borderless_button"/>
    
  1. 테두리없는 색상 버튼 : @style/Widget.AppCompat.Button.Borderless.Colored

    경계선없는 컬러 단추 이미지

    <Button
        style="@style/Widget.AppCompat.Button.Borderless.Colored"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp" 
        android:text="@string/borderless_colored_button"/>
    

TextInputLayout을 사용하는 방법

종속성에 따라 앱의 build.gradle 파일에 다음 종속성이 추가되었는지 확인하십시오.

compile 'com.android.support:design:25.3.1'

값을 입력 할 때 EditText의 힌트를 플로팅 레이블로 표시하십시오.

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

     <android.support.design.widget.TextInputEditText
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:hint="@string/form_username"/>

</android.support.design.widget.TextInputLayout>

TextInputLayout을 사용하여 비밀번호 표시 아이콘을 표시하려면 다음 코드를 사용할 수 있습니다.

<android.support.design.widget.TextInputLayout
    android:id="@+id/input_layout_current_password"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:passwordToggleEnabled="true">

    <android.support.design.widget.TextInputEditText

        android:id="@+id/current_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/current_password"
        android:inputType="textPassword" />

</android.support.design.widget.TextInputLayout>

여기서 app:passwordToggleEnabled="true" & android:inputType="textPassword" 매개 변수가 필요합니다.

app 은 네임 스페이스 xmlns:app="http://schemas.android.com/apk/res-auto" 사용해야합니다 xmlns:app="http://schemas.android.com/apk/res-auto"

자세한 내용과 예제는 전용 주제 에서 찾을 수 있습니다.

TabLayout 추가하기

TabLayout 은 탭을 표시하기위한 가로 레이아웃을 제공하며 일반적으로 ViewPager 와 함께 사용됩니다.

종속성에 따라 앱의 build.gradle 파일에 다음 종속성이 추가되었는지 확인하십시오.

compile 'com.android.support:design:25.3.1'

이제 TabItem 클래스를 사용하여 레이아웃의 TabLayout에 항목을 추가 할 수 있습니다.

예 :

<android.support.design.widget.TabLayout
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:id="@+id/tabLayout">

    <android.support.design.widget.TabItem
        android:text="@string/tab_text_1"
        android:icon="@drawable/ic_tab_1"/>

    <android.support.design.widget.TabItem
        android:text="@string/tab_text_2"
        android:icon="@drawable/ic_tab_2"/>

</android.support.design.widget.TabLayout>

추가 OnTabSelectedListener 에 탭 때 알림을받을 TabLayout 선택 / 선택 해제가 / 다시 선택 :

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        int position = tab.getPosition();
        // Switch to view for this tab
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {

    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {

    }
});

탭은 프로그램 적으로 TabLayout 추가 / 삭제할 수도 있습니다.

TabLayout.Tab tab = tabLayout.newTab();
tab.setText(R.string.tab_text_1);
tab.setIcon(R.drawable.ic_tab_1);
tabLayout.addTab(tab);

tabLayout.removeTab(tab);
tabLayout.removeTabAt(0);
tabLayout.removeAllTabs();

TabLayout 에는 고정 및 스크롤 가능한 두 가지 모드가 있습니다.

tabLayout.setTabMode(TabLayout.MODE_FIXED);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);

이것들은 XML에도 적용될 수 있습니다 :

<android.support.design.widget.TabLayout
    android:id="@+id/tabLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabMode="fixed|scrollable" />

주 : TabLayout 모드는 동시에 사용할 수 TabLayout 때문에 한 번에 하나만 활성화 할 수 있습니다.

탭 표시기 색은 재료 디자인 테마에 대해 정의 된 강조 색입니다.
styles.xml 에서 사용자 정의 스타일을 정의한 다음이 스타일을 TabLayout에 적용하여이 색상을 재정의 할 수 있습니다.

<style name="MyCustomTabLayoutStyle" parent="Widget.Design.TabLayout">
    <item name="tabIndicatorColor">@color/your_color</item>
</style>

그런 다음 다음을 사용하여보기에 스타일을 적용 할 수 있습니다.

<android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        style="@style/MyCustomTabLayoutStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
</android.support.design.widget.TabLayout>

RippleDrawable

Ripple 터치 효과는 Android 5.0 (API 레벨 21)에서 재료 디자인으로 도입되었으며 애니메이션은 새로운 RippleDrawable 클래스로 구현됩니다.

상태 변경에 따른 파급 효과를 나타내는 드로어 블입니다. 주어진 상태에 대한 리플의 고정 위치는 setHotspot(float x, float y) 를 해당 상태 속성 식별자와 함께 호출하여 지정할 수 있습니다.

5.0

일반적으로 일반 버튼의 리플 효과는 기본적 으로 API 21 이상에서 작동 하며 다른 터치 가능보기의 경우 다음을 지정하여 수행 할 수 있습니다.

android:background="?android:attr/selectableItemBackground">

보기 내에 포함 된 잔물결 또는

android:background="?android:attr/selectableItemBackgroundBorderless"

보기의 범위를 넘어선 잔물결들.

예를 들어, 아래 이미지에서,

  • B1은 배경이없는 버튼으로,
  • B2는 android:background="android:attr/selectableItemBackground"
  • B3은 android:background="android:attr/selectableItemBackgroundBorderless"

(이미지 제공 : http://blog.csdn.net/a396901990/article/details/40187203 )

다음을 사용하여 코드에서 동일한 결과를 얻을 수 있습니다.

int[] attrs = new int[]{R.attr.selectableItemBackground};
TypedArray typedArray = getActivity().obtainStyledAttributes(attrs);
int backgroundResource = typedArray.getResourceId(0, 0);
myView.setBackgroundResource(backgroundResource);

Ripples은 위와 같은 방법으로 android:foreground 속성을 사용하여 뷰에 추가 할 수도 있습니다. 이름에서 알 수 있듯이 리플이 포 그라운드에 추가 된 경우 리플이 추가 된 모든 뷰 (예 : ImageView , 여러 뷰가 포함 된 LinearLayout 등) 위에 리플이 표시됩니다.

잔물결 효과를보기로 사용자 정의하려면 드로어 블 디렉토리에 새 XML 파일을 만들어야합니다.

다음은 몇 가지 예입니다.

예제 1 : 무한 리플

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#ffff0000" />

예제 2 : 마스크와 배경색이 적용된 리플

<ripple android:color="#7777777"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/mask"
        android:drawable="#ffff00" />
    <item android:drawable="@android:color/white"/>
</ripple>

이 경우 view 이미 지정 배경과 shape , corners 및 기타 태그하는 사용하는보기에 리플을 추가하는 mask layer 하고 뷰의 배경으로 리플을 설정합니다.

:

 <?xml version="1.0" encoding="utf-8"?>
    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:attr/colorControlHighlight">
        <item android:id="@android:id/mask">
           <shape 
              android:shape="rectangle">
              solid android:color="#000000"/>
               <corners
                 android:radius="25dp"/>
            </shape>
        </item>
        <item android:drawable="@drawable/rounded_corners" />
    </ripple>

예제 3 : 드로어 블 리소스 위에 리플

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#ff0000ff">
    <item android:drawable="@drawable/my_drawable" />
</ripple>

사용법 : 임의의보기에 리플 XML 파일을 첨부하려면 다음과 같이 배경으로 설정하십시오 (리플 파일의 이름이 my_ripple.xml 이라고 my_ripple.xml ).

<View 
    android:id="@+id/myViewId"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/my_ripple" />

선택자:

대상 버전이 v21 이상인 경우 색상 상태 목록 선택기 대신 리플 드로어 블을 사용할 수도 있습니다 (리플 선택기를 drawable-v21 폴더에 배치 할 수도 있음).

<!-- /drawable/button.xml: -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/button_pressed"/>
    <item android:drawable="@drawable/button_normal"/>
</selector>

<!--/drawable-v21/button.xml:-->
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorControlHighlight">
   <item android:drawable="@drawable/button_normal" />
</ripple>

이 경우 뷰의 기본 상태 색은 흰색이고 누름 상태는 리플 드로어 블을 표시합니다.

참고 사항 : ?android:colorControlHighlight 를 사용하면 리플에 앱의 내장 잔물결과 같은 색상이 적용됩니다.

리플 색상 만 변경하려면 다음과 같이 테마에서 색상 android:colorControlHighlight 을 사용자 정의 할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
    <item name="android:colorControlHighlight">@color/your_custom_color</item>
  </style>

</resources>

그런 다음이 테마를 활동 등에 사용하십시오. 효과는 아래 이미지와 같습니다.

(이미지 제공 : http://blog.csdn.net/a396901990/article/details/40187203 )

탐색 창 추가

탐색 서랍 은 앱에서 최상위 목적지로 이동하는 데 사용됩니다.

build.gradle 파일에 디자인 지원 라이브러리를 추가했는지 확인하십시오.

 dependencies {
    // ...
    compile 'com.android.support:design:25.3.1'
}

그런 다음 XML 레이아웃 리소스 파일에 DrawerLayoutNavigationView 를 추가합니다.
DrawerLayout 은 실제 네비게이션 서랍 인 NavigationView 화면의 왼쪽이나 오른쪽에서 밀어 낼 수있는 멋진 컨테이너입니다. 참고 : 휴대 기기의 경우 표준 서랍 크기는 320dp입니다.

<!-- res/layout/activity_main.xml -->
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/navigation_drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">
    <! -- You can use "end" to open drawer from the right side -->

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.AppBarLayout>

    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_drawer"
        android:layout_width="320dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/navigation_menu" />

</android.support.v4.widget.DrawerLayout>

이제 원하는 경우 탐색함에 상단으로 사용할 헤더 파일 을 만듭니다. 이는 서랍에 훨씬 더 우아한 느낌을주는 데 사용됩니다.

<!-- res/layout/drawer_header.xml -->
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="190dp">

    <ImageView
        android:id="@+id/header_image"
        android:layout_width="140dp"
        android:layout_height="120dp"
        android:layout_centerInParent="true"
        android:scaleType="centerCrop"
        android:src="@drawable/image" />

    <TextView
        android:id="@+id/header_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/header_image"
        android:text="User name"
        android:textSize="20sp" />

</RelativeLayout>

NavigationView 태그의 app:headerLayout="@layout/drawer_header" 속성에서 참조됩니다.
app:headerLayout 은 지정된 레이아웃을 헤더에 자동으로 app:headerLayout 합니다. 이 방법은 다음과 같은 방법으로 런타임에 수행 할 수 있습니다.

// Lookup navigation view
NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_drawer);
// Inflate the header view at runtime
View headerLayout = navigationView.inflateHeaderView(R.layout.drawer_header);

재료 디자인에 맞는 탐색 항목을 사용하여 탐색 서랍을 자동으로 채우려면 메뉴 파일을 만들고 필요에 따라 항목을 추가합니다. 참고 : 항목 아이콘은 필수는 아니지만 재질 디자인 사양에 제안되어 있습니다.
app:menu="@menu/navigation_menu" attributeNavigationView 태그에서 참조됩니다.

<!-- res/menu/menu_drawer.xml -->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/nav_item_1"
        android:title="Item #1"
        android:icon="@drawable/ic_nav_1" />
    <item
        android:id="@+id/nav_item_2"
        android:title="Item #2"
        android:icon="@drawable/ic_nav_2" />
    <item
        android:id="@+id/nav_item_3"
        android:title="Item #3"
        android:icon="@drawable/ic_nav_3" />
    <item
        android:id="@+id/nav_item_4"
        android:title="Item #4"
        android:icon="@drawable/ic_nav_4" />
</menu>

항목을 그룹으로 분리하려면 android:title 속성을 사용하여 다른 <item> 중첩 된 <menu> 넣거나 <group> 태그로 묶습니다.

이제 레이아웃이 완료 Activity 코드로 이동하십시오.

  // Find the navigation view
  NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_drawer);
  navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
      @Override
      public boolean onNavigationItemSelected(MenuItem item) {
          // Get item ID to determine what to do on user click
          int itemId = item.getItemId();
          // Respond to Navigation Drawer selections with a new Intent
          startActivity(new Intent(this, OtherActivity.class));
          return true;
      }
  });

  DrawerLayout drawer = (DrawerLayout) findViewById(R.id.navigation_drawer_layout);
  // Necessary for automatically animated navigation drawer upon open and close
  ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, "Open navigation drawer", "Close navigation drawer");
  // The two Strings are not displayed to the user, but be sure to put them into a separate strings.xml file.
  drawer.addDrawerListener(toggle);
  toogle.syncState();

이제 NavigationView 의 머리글보기에서 원하는대로 할 수 있습니다.

View headerView = navigationView.getHeaderView();
TextView headerTextView = (TextView) headerview.findViewById(R.id.header_text_view);
ImageView headerImageView = (ImageView) headerview.findViewById(R.id.header_image);
// Set navigation header text
headerTextView.setText("User name");
// Set navigation header image
headerImageView.setImageResource(R.drawable.header_image);

헤더 뷰는 다른 View 와 같이 동작하므로 findViewById() 를 사용하고 다른 View 를 레이아웃 파일에 추가하면 해당 View 의 모든 요소에 대한 속성을 설정할 수 있습니다.

자세한 내용과 예제는 전용 주제 에서 찾을 수 있습니다.

디자인 지원 라이브러리의 하단 시트

하단 시트 는 화면 하단에서 위로 밀어서 더 많은 내용을 표시합니다.
그들은 v25.1.0 버전의 Android Support Library에 추가되었으며 모든 버전에서 지원됩니다.

종속성에 따라 앱의 build.gradle 파일에 다음 종속성이 추가되었는지 확인하십시오.

 compile 'com.android.support:design:25.3.1'

영구적 인 바닥 시트

BottomSheetBehavior 를 자식에게 연결하는 지속 바닥 시트CoordinatorLayout 의 하위 뷰를 얻을 수 있습니다.

<android.support.design.widget.CoordinatorLayout >

    <!-- .....   -->

    <LinearLayout
       android:id="@+id/bottom_sheet"
       android:elevation="4dp"
       android:minHeight="120dp"
       app:behavior_peekHeight="120dp"
       ...
       app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

           <!-- .....   -->

       </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

그런 다음 코드에서 다음을 사용하여 참조를 만들 수 있습니다.

 // The View with the BottomSheetBehavior  
 View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);  
 BottomSheetBehavior mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);  

setState () 메서드를 사용하여 BottomSheetBehavior의 상태를 설정할 수 있습니다.

mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);

다음 상태 중 하나를 사용할 수 있습니다.

  • STATE_COLLAPSED :이 접힌 상태가 기본값이며 하단의 레이아웃 일부만 표시됩니다. 높이는 app:behavior_peekHeight 속성 (기본값은 0)으로 제어 할 수 있습니다 app:behavior_peekHeight

  • STATE_EXPANDED : 전체 바닥 시트 중 하나가 표시되는 바닥 판의 완전 팽창 상태 (높이가 함유 미만인 경우 CoordinatorLayout ) 또는 전체 CoordinatorLayout 가득

  • STATE_HIDDEN : 기본적으로 사용 중지되며 app:behavior_hideable 속성을 사용하도록 설정하면 사용자가 하단 시트를 아래로 스 와이프하여 하단 시트를 완전히 숨길 수 있습니다.

원하는보기를 클릭하여 BottomSheet를 열거 나 닫을 때, A Button은 시트 비헤이비어를 전환하고보기를 업데이트하는 방법을 알려줍니다.

mButton = (Button) findViewById(R.id.button_2);
    //On Button click we monitor the state of the sheet
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
                //If expanded then collapse it (setting in Peek mode).
                mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
                mButton.setText(R.string.button2_hide);
            } else if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_COLLAPSED) {
                //If Collapsed then hide it completely.
                mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
                mButton.setText(R.string.button2);
            } else if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
                //If hidden then Collapse or Expand, as the need be.
                mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                mButton.setText(R.string.button2_peek);
            }
        }
    });

그러나 BottomSheet 동작에는 사용자가 스 와이프 UP 또는 DRAG 동작을 통해 DRAG 동작과 상호 작용할 수있는 기능이 있습니다. 이 경우 시트 상태가 변경되면 종속 뷰를 업데이트 할 수 없습니다 (위의 버튼과 같음). 그 점에서 상태 변경 콜백을 수신하려고하므로 BottomSheetCallback 을 추가하여 사용자가 스 와이프 이벤트를 수신 할 수 있습니다.

mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetCallback() {  
    @Override  
    public void onStateChanged(@NonNull View bottomSheet, int newState) {  
      // React to state change and notify views of the current state
    }  
      @Override  
      public void onSlide(@NonNull View bottomSheet, float slideOffset) {  
       // React to dragging events and animate views or transparency of dependent views
   }  
 });  

그리고 COLLAPSED 및 EXPANDED 모드 전환시에만 Bottom Sheet를 보이게하고 결코 사용하지 않으려면 :

mBottomSheetBehavior2.setHideable(false);

하단 시트 DialogFragment

하단 시트의보기 위치에 BottomSheetDialogFragment 를 표시 할 수도 있습니다. 이렇게하려면 먼저 BottomSheetDialogFragment를 확장하는 새 클래스를 만들어야합니다.

setupDialog() 메서드 내에서 새 레이아웃 파일을 확장하고 Activity에서 컨테이너보기의 BottomSheetBehavior를 검색 할 수 있습니다. 비헤이비어가 있으면 BottomSheetCallback 을 만들어 연관시켜 시트가 숨겨져있을 때 Fragment를 닫을 수 있습니다.

public class BottomSheetDialogFragmentExample extends BottomSheetDialogFragment {
 
    private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {
 
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                dismiss();
            }
 
        }
 
        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        }
    };
 
    @Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        View contentView = View.inflate(getContext(), R.layout.fragment_bottom_sheet, null);
        dialog.setContentView(contentView);
 
        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
        CoordinatorLayout.Behavior behavior = params.getBehavior();
 
        if( behavior != null && behavior instanceof BottomSheetBehavior ) {
            ((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
        }
    }
}

마지막으로 Fragment 인스턴스에서 show ()를 호출하여 맨 아래 시트에 표시 할 수 있습니다.

BottomSheetDialogFragment bottomSheetDialogFragment = new BottomSheetDialogFragmentExample();
bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag());

전용 주제 에서 자세한 내용을 확인할 수 있습니다.

스낵바 추가

머티리얼 디자인의 주요 특징 중 하나는 Snackbar 가 추가 된 것입니다.이 Snackbar 는 이론적으로 이전 Toast 대체합니다. 안드로이드 문서에 따라 :

Snackbars에는 수행 된 작업과 직접 관련이있는 텍스트 한 줄이 들어 있습니다. 텍스트 액션을 포함 할 수 있지만 아이콘은 없습니다. 토스트는 주로 시스템 메시징에 사용됩니다. 또한 화면 하단에 표시되지만 화면 밖으로 스 와이프되지 않을 수도 있습니다.

여기에 이미지 설명을 입력하십시오.

사용자에게 메시지를 표시하기 위해 Android에서 토스트를 계속 사용할 수 있지만 앱에서 재료 디자인 사용을 선택했다면 실제로 스낵바를 사용하는 것이 좋습니다. 화면에 오버레이로 표시되는 대신 Snackbar 가 아래에서 나타납니다.

다음과 같이 수행됩니다.

Snackbar snackbar = Snackbar
        .make(coordinatorLayout, "Here is your new Snackbar", Snackbar.LENGTH_LONG);
snackbar.show();

Snackbar 를 표시하는 데 걸리는 시간은 Toast 제공하는 것과 비슷한 옵션이 있거나 밀리 초 단위로 사용자 지정 기간을 설정할 수 있습니다.

  • LENGTH_SHORT
  • LENGTH_LONG
  • LENGTH_INDEFINITE
  • setDuration() (버전 22.2.1 이후)

ActionCallback 이나 사용자 정의 색상과 같은 동적 기능을 Snackbar 추가 할 수도 있습니다. 그러나 Snackbar 사용자 정의 할 때 Android에서 제공하는 디자인 가이드 라인에 주의하십시오.

그러나 Snackbar 를 구현하는 Snackbar 한 가지 한계가 있습니다. Snackbar 를 구현하려는 뷰의 부모 레이아웃은 CoordinatorLayout 이어야합니다. 이것은 하단에서 실제 팝업이 만들어 지도록하기 위해서입니다.

다음은 레이아웃 xml 파일에 CoordinatorLayout 을 정의하는 방법입니다.

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
    //any other widgets in your layout go here.
 
</android.support.design.widget.CoordinatorLayout>

그런 다음 CoordinatorLayout onCreate 액티비티의 onCreate 메소드에 정의한 다음 Snackbar 자체를 만들 때 사용해야합니다.

Snackbar 에 대한 자세한 내용은 공식 문서 또는 설명서전용 주제 를 확인하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow