본문 바로가기

Android/Basic

[Android] Navigation drawer (바로가기 메뉴)

- DrawerLayout : 다른 레이아웃이나 다른 뷰를 담을 수 있는 레이아웃 중 하나

- include 태그 : 중복되는 xml 레이아웃 그대로 집어넣기.

- NavigationView : 바로가기 메뉴의 화면 레이아웃(사용자 프로필, 메뉴들 보이는 레이아웃)


0. navigation drawer는 대부분 모든 화면에 적용. 액티비티로 구성한다면 모든 레이아웃에 적용시켜야하기 때문에 엄청난 중복이 발생함.  그래서 모든 화면을 fragment로 구성하는 것이 바람직한 방법. 


1. 액션바 없애기

- styles.xml 에서 테마 추가

<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

- manifest 에서 테마 변경

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme.NoActionBar">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>


2. 레이아웃 구조

- DrawerLayout

- - CoordinatorLayout

- - - AppBarLayout

- - - - Toolbar

- - - FrameLayout 

- NavigationView

<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"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />

  



3. NavigationView의 헤더(사용자 프로필 등), 메뉴 레이아웃 구성

+ menu 레이아웃은 menu 디렉토리 생성 후 추가해야함.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="navigation_view">

<group android:checkableBehavior="single">
<item
android:id="@+id/nav_0"
android:icon="@mipmap/ic_launcher"
android:title="첫번째 화면" />
<item
android:id="@+id/nav_1"
android:icon="@mipmap/ic_launcher"
android:title="두번째 화면" />
<item
android:id="@+id/nav_2"
android:icon="@mipmap/ic_launcher"
android:title="세번째 화면" />
</group>
</menu>


4. MainActivity.class 에서 할일

 (1) implement NavigationView.OnNavigationItemSelectedListener 

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
return false;
}

 (2) toolbar 적용하기 -> NoActionBar 안하면 illegalException 발생

 (3) DrawerLayout에 토글 리스너 등록(메뉴 선택시)


5. NavigationView에 현재 액티비티 리스너 등록.

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);

        navigationView.setNavigationItemSelectedListener(this);


+ back 버튼 눌렀을 때 navigationDrawer 닫는 방법

@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}


6. Fragment 띄워주기.

- FragmentCallback interface 이용.

public interface FragmentCallback {

public void onFragmentSelected(int position, Bundle bundle);
}


- MainActivity 에서 구현

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, FragmentCallback {
@Override
public void onFragmentSelected(int position, Bundle bundle) {
Fragment curFragment = null;
if (position == 0) {
curFragment = fragment1;
toolbar.setTitle("첫번째 화면");
} else if (position == 1) {
curFragment = fragment2;
toolbar.setTitle("두번째 화면");
} else if (position == 2) {
curFragment = fragment3;
toolbar.setTitle("세번째 화면");
}

getSupportFragmentManager().beginTransaction().replace(R.id.container, curFragment).commit();
}



전체코드 1(안드로이드 기본제공) : https://github.com/Onedelay/MyDrawer.git

전체코드 2(empty에서 직접 만들기) : https://github.com/Onedelay/TestDrawer.git