MainActivity.kt
package com.example.forStudy
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.MenuItem
import android.widget.Toast
import androidx.appcompat.widget.Toolbar
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import com.google.android.material.navigation.NavigationView
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
lateinit var navigationView: NavigationView
lateinit var drawerLayout: DrawerLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportFragmentManager.beginTransaction().replace(binding.framLayout.id, 프래그먼트클래스()).commit() // replace의 마지막 인자에는 자신이 생성한 프래그먼트의 클래스를 넣으면 된다.
setContentView(R.layout.activity_main)
val toolbar: Toolbar = findViewById(R.id.toolbar) // toolBar를 통해 App Bar 생성
setSupportActionBar(toolbar) // 툴바 적용
supportActionBar?.setDisplayHomeAsUpEnabled(true) // 드로어를 꺼낼 홈 버튼 활성화
supportActionBar?.setHomeAsUpIndicator(R.drawable.navi_menu) // 홈버튼 이미지 변경
supportActionBar?.setDisplayShowTitleEnabled(false) // 툴바에 타이틀 안보이게
// 네비게이션 드로어 생성
drawerLayout = findViewById(R.id.drawer_layout)
// 네비게이션 드로어 내에있는 화면의 이벤트를 처리하기 위해 생성
navigationView = findViewById(R.id.nav_view)
navigationView.setNavigationItemSelectedListener(this) //navigation 리스너
}
// 툴바 메뉴 버튼이 클릭 됐을 때 실행하는 함수
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// 클릭한 툴바 메뉴 아이템 id 마다 다르게 실행하도록 설정
when(item!!.itemId){
android.R.id.home->{
// 햄버거 버튼 클릭시 네비게이션 드로어 열기
drawerLayout.openDrawer(GravityCompat.START)
}
}
return super.onOptionsItemSelected(item)
}
// 드로어 내 아이템 클릭 이벤트 처리하는 함수
override fun onNavigationItemSelected(item: MenuItem): Boolean {
when(item.itemId){
R.id.menu_item1-> Toast.makeText(this,"menu_item1 실행",Toast.LENGTH_SHORT).show()
R.id.menu_item2-> Toast.makeText(this,"menu_item2 실행",Toast.LENGTH_SHORT).show()
R.id.menu_item3-> Toast.makeText(this,"menu_item3 실행",Toast.LENGTH_SHORT).show()
}
return false
}
}
프래그먼트클래스.kt
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.youngs.todayverse.databinding.FragmentMainBinding
class 프래그먼트클래스 : Fragment() {
lateinit var binding: FragmentMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = FragmentMainBinding.inflate(layoutInflater)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return binding.root
}
}
activity_main.xml
아래 코드를 이용해서 FrameLayout 부분을 변경하면 해당 부분만 변경할수있다.
<?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/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/container_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include
layout="@layout/appbar"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
<FrameLayout
android:id="@+id/framLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</LinearLayout>
<com.google.android.material.navigation.NavigationView
app:layout_constraintStart_toStartOf="parent"
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/menu_list"
app:headerLayout="@layout/header"/>
</androidx.drawerlayout.widget.DrawerLayout>
fragment_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="테스트" />
</FrameLayout>
header.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="200dp"
android:background="@color/cardview_dark_background"
android:gravity="center"
android:orientation="vertical"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Select Item"
android:textSize="50dp" />
</LinearLayout>
appbar.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="match_parent"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" />
</com.google.android.material.appbar.AppBarLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
menulist.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_item1"
android:title="메뉴 아이템 1" />
<item
android:id="@+id/menu_item2"
android:title="메뉴 아이템 2" />
<item
android:id="@+id/menu_item3"
android:title="메뉴 아이템 3" />
</menu>
아이콘을 추가하려면 menulist.xml의 <item> 항목에 android:icon="@drawable/[파일명]"을 이용해 추가한다.
Navigation Drawer가 Tool bar를 가리고 있다면 fitsSystemWindows 값을 수정하면된다.
필자가 참고한 출처 링크에서는 해당값을 true로 주고있지만, 그렇게하면 Tool bar를 가리기 때문에 필자는 해당 옵션을 지웠다.
참고 : https://devvkkid.tistory.com/96
출처 : https://stickode.tistory.com/114
'프로그래밍 > Android' 카테고리의 다른 글
Relative layout 사용법 (0) | 2021.09.14 |
---|---|
안드로이드 스튜디오 영어가 이상하게 써질때 (0) | 2021.09.07 |
scrcpy 무선 연결 (2) | 2021.08.06 |
scrcpy 단축키 (1) | 2021.07.28 |
안드로이드 어플 아이콘 변경 (0) | 2021.07.24 |
댓글