Navigation Drawer Menu ๊ตฌํ
[2020-07-12]
์ฐ๋ฆฌ๋ ์๋์ด๋ ธ์ DC ๋ชจํฐ ๋ฌธ์ ๋ก ์ธํด
๋จผ์ ์๋๋ก์ด๋ ์คํ๋์ค๋ฅผ ์ด์ฉํด ๊ธฐ๋ณธ์ ์ธ ํ์ ๋ง๋ค๊ธฐ๋ก ํ์๊ณ ,
๋จผ์ ๋ฉ๋ด ๋ฒํผ์ ๋๋ฅด๋ฉด ์ข์ธก์์ ๋ฉ๋ด๊ฐ ์ฌ๋ผ์ด๋๋ก ๋์๋ค ๋ค์ด๊ฐ๋ค ํ ์ ์๋
์ฌ๋ผ์ด๋ ๋ฉ๋ด๋ฅผ ๊ตฌํํด ๋ณด๊ธฐ๋ก ํ๋ค.
#01. ๋ฉ๋ด๋ฒํผ ํด๋ฆญ ์ Navigation Drawer Menu๊ฐ ๋์ค๋๋ก ์ค์
- build.gradle(:app)
//Material Design
implementation 'com.google.android.material:material:1.2.0-alpha02'
//Rounded Image View
implementation 'com.makeramen:roundedimageview:2.3.0'
//Navigation Component
implementation 'androidx.navigation:navigation-fragment-ktx:2.2.0-rc03'
implementation 'androidx.navigation:navigation-ui-ktx:2.2.0-rc03'
๊ฐ์ฅ ๋จผ์ ํด์ผํ ์ผ์ dependencies { }์ ๋ด์ฉ์ ์ ๋ ฅํ๊ณ SYNC๋ฅผ ํด์ฃผ๋ ์ผ์ด๋ค.
ํ๋ซํผ๊ณผ ๊ธฐ๊ธฐ ์ ๋ฐ์ ์๊ฐ์ ์ธ ์์๋ฅผ ๋์์ธํ๊ธฐ ์ํ Material Design,
์ด๋ฏธ์ง์ ๋ชจ์๋ฆฌ๋ฅผ ๋ฅ๊ธ๊ฒ ์ค์ ํด ์ค ์ ์๋ Rounded Image View,
ํ์ด์ง๊ฐ์ ์ด๋์ ์ฝ๊ณ ์์ ์ ์ผ ์ ์๋๋ก ๋์์ฃผ๋ Navigation Component๋ฅผ ์ ๋ ฅํด ์ฃผ์๋ค.
- styles.xml
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
style.xml์์ style์ parent๋ฅผ "Theme.AppCompat.Light.DarkActionBar"์์
"Theme.MaterialComponents.Light.NoActionBar"๋ก ๋ณ๊ฒฝํด ์ฃผ์๋ค.
์ด๋ ๊ฒ ๋๋ฉด DarkActionBar์์ NoActionBar๋ก ๋ณ๊ฒฝ๋์ด์
์๋จ์ ์ก์ ๋ฐ๊ฐ ์ฌ๋ผ์ง๊ฒ ๋๋๋ฐ
์ถํ์ ํด๋ฐ๋ฅผ ์ ์ํ๊ธฐ ์ํจ์ด๋ค.
- colors.xml, strings.xml, ์ด๋ฏธ์ง ์ถ๊ฐ
ํ์ผ ์ด๋ฆ | ์ค๋ช |
back.png | ์ฌ๋ผ์ด๋ ๋ฉ๋ด์ ์๋จ ๋ท๋ฐฐ๊ฒฝ |
fan.png | ์ฌ๋ผ์ด๋ ๋ฉ๋ด์ ์๋จ ๋ก๊ณ |
ic_addremote.xml | ๋ฆฌ๋ชจ์ปจ ์ถ๊ฐ ์์ด์ฝ |
ic_explain.xml | ์ดํ๋ฆฌ์ผ์ด์ ์ค๋ช ์์ด์ฝ |
ic_home.xml | ํ ์์ด์ฝ |
ic__menu.xml | ์๋จ ํด๋ฐ์ ์์นํ ๋ฉ๋ด ์์ด์ฝ |
ic_remote.xml | ๋ฆฌ๋ชจ์ปจ ์์ด์ฝ |
ic_settings.xml | ํ๊ฒฝ์ค์ ์์ด์ฝ |
์ด์ธ์๋ ํ๋ฉด์ ๋์์ธ์ ์๊ตฌํ๋ ๊ฒ๋ค๋ ๋ฐ๋ก ์ถ๊ฐํด ์ฃผ์๋ค.
- menu/navigation_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/nav_home"
android:icon="@drawable/ic_home"
android:title="@string/home" />
<item android:title="@string/remote">
<menu>
<item
android:id="@+id/nav_remote"
android:icon="@drawable/ic_remote"
android:title="@string/remote_control"/>
<item
android:id="@+id/nav_addremote"
android:icon="@drawable/ic_addremote"
android:title="@string/add_remote_control"/>
</menu>
</item>
<item
android:id="@+id/nav_explain"
android:icon="@drawable/ic_explain"
android:title="@string/explain" />
<item
android:id="@+id/nav_settings"
android:icon="@drawable/ic_settings"
android:title="@string/settings" />
</menu>
๋ณธ๊ฒฉ์ ์ผ๋ก ๋จผ์ ๋ฉ๋ด ๋ฒํผ์ ๋๋ฅด๋ฉด ์ข์ธก์์ ์ฌ๋ผ์ด๋ฉํ๋ฉด์ ๋์ค๋
menu์ ๋ ์ด์์์ ๋ง๋ค์ด ์ค๋ค.
- layout/layout_navigation_header.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="200dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:padding="10dp"
android:background="@drawable/back">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/fan"
android:layout_width="100dp"
android:layout_height="100dp"
android:scaleType="centerCrop"
android:src="@drawable/fan"
android:layout_marginTop="35dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_oval="false"/>
<View
android:id="@+id/viewSupporter"
android:layout_width="1dp"
android:layout_height="1dp"
app:layout_constraintBottom_toBottomOf="@id/fan"
app:layout_constraintEnd_toEndOf="@id/fan"
app:layout_constraintStart_toStartOf="@id/fan"
app:layout_constraintTop_toTopOf="@id/fan"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="45dp"
android:text="@string/smart_fan"
android:textColor="@color/colorPrimaryText"
android:textSize="28sp"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@id/viewSupporter"
app:layout_constraintStart_toEndOf="@id/fan"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="16dp"
android:text="๋๋ํ ์ ํ๊ธฐ Smart Fan"
android:textColor="@color/colorPrimaryText"
android:textSize="12sp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@id/fan"
app:layout_constraintTop_toBottomOf="@id/viewSupporter" />
</androidx.constraintlayout.widget.ConstraintLayout>
navigation_menu.xml์์ ๋ง๋ ํญ๋ชฉ๋ค ์์
๋ฐฐ๋์ฒ๋ผ ํด๋น ์ฑ์ ๋๋ต์ ์ธ ์ค๋ช ๊ณผ ์ด๋ฏธ์ง๊ฐ ๋ค์ด๊ฐ ํค๋๋ฅผ ๋ง๋ค์ด ์ฃผ์๋ค.
- layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.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/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:background="@color/colorPrimary"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="15dp"
android:paddingEnd="15dp"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/imageMenu"
android:layout_width="30dp"
android:layout_height="30dp"
android:contentDescription="@string/app_name"
android:src="@drawable/ic_menu"
android:tint="@color/colorWhite"/>
<TextView
android:id="@+id/textTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:text="@string/app_name"
android:textColor="@color/colorWhite"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:headerLayout="@layout/layout_navigation_header"
app:menu="@menu/navigation_menu"
android:layout_gravity="start"/>
</androidx.drawerlayout.widget.DrawerLayout>
activity_main.xml์์๋ ํ ํ๋ฉด์์ ์๋จ์ ์๋ ํด๋ฐ๋ฅผ ์์ฑํ์๊ณ ,
ํด๋ฐ์ ์ข์ธก์ ์๋ ๋ฉ๋ด ๋ฒํผ์ ์์ฑํด
ํด๋ฆญ ์ ๋ค๋น๊ฒ์ด์ ๋ฉ๋ด์ ์ ์ํ ์ ์๋๋ก ๊ตฌ์ฑํ์๋ค.
- MainActivity.java
package com.example.smartfan;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import android.os.Bundle;
import android.view.View;
import com.google.android.material.navigation.NavigationView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final DrawerLayout drawerLayout = findViewById(R.id.drawerLayout);
findViewById(R.id.imageMenu).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// start์ ์ง์ ๋ Drawer ์ด๊ธฐ
drawerLayout.openDrawer(GravityCompat.START);
}
});
NavigationView navigationView = findViewById(R.id.navigationView);
navigationView.setItemIconTintList(null);
}
}
javaํ์ผ์ ํตํด์ ํด๋ฐ์ ์๋ ๋ฉ๋ด ๋ชจ์ ์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ ๊ฒฝ์ฐ์
์ข์ธก์ ์์นํ ๋ฉ๋ด๊ฐ ์ด๋ฆด ์ ์๋๋ก ์ค์ ํด ์ฃผ์๋ค.
์ ๋ฎฌ๋ ์ดํฐ๋ฅผ ์คํํด๋ณด๋ฉด ๋ฉ๋ด ๋ฒํผ์ ํด๋ฆญํ๋ฉด
์ข์ธก์ ๋ฉ๋ด๊ฐ ์ด๋ฆฌ๊ณ ๋ซํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ด์ฉ์ด ๊ธธ์ด์ ธ์ ์ผ๋จ์ ๋ฉ๋ด๋ฅผ ๋ง๋ค์ด์ง ๊ฒ๊น์ง๋ง ๋ณด์ฌ์ฃผ์์ง๋ง
๋ค์์๋ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๊ฐ ํ์ด์ง๋ก ๋๊ธฐ๋๋ก ํ๋ ๊ฒ๋ ์ค์ ํด ์ค ๋ณด๋๋ก ํ์.
'์๋ > Smart_Fan' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Smart_Fan] 07 - Android Studio : ์ธํธ๋ก ํ๋ฉด ์ ์ (1) | 2020.08.07 |
---|---|
[Smart_Fan] 06 - Android Studio : Navigation Drawer Menu ๊ตฌํ 02 (1) | 2020.07.31 |
[Smart_Fan] 04 - Arduino : ๋ฒํผ์ผ๋ก DC๋ชจํฐ ์ ์ ๊ป๋ค ๋๊ธฐ (0) | 2020.07.26 |
[Smart_Fan] 03 - Arduino : DC๋ชจํฐ ์๋ ์ํค๊ธฐ (0) | 2020.07.25 |
[Smart_Fan] 02 - Oven์ผ๋ก ์ฑ UI ๊ตฌ์ ๋ฐ ์๋์ด๋ ธ ๊ตฌ์ (0) | 2020.07.20 |
๋๊ธ