활용) "접근성","이메일","메시지" 카테고리가 있는 네비게이션 뷰 메뉴 만들기.
네비게이션 뷰? 카테고리를 포함한 네비게이션 뷰가 열고 닫히는 메뉴.
네비게이션 뷰를 활용하기 전에 네비게이션 뷰를 사용하게끔 import를 해주어야 한다. Gradls Scripts > build.gradle > dependentcies 경로를 통해 implementation 'com.google.android.meterial.meterial:1.0.0' 추가하여 sync Now 한다. 이 곳은 안드로이드 스튜디오의 기본적인 설정값들을 지정해주는 곳이다. 거기서 dependentcies은 사용자들이 만든 라이브러리, 안드로이드 스튜디오에서 자체 제공하는 라이브러리를 사용하게 하는 기능이 있다.
네비게이션 뷰를 import 한 후, 네비게이션 메뉴를 준비할 수 있는 .xml을 만든다. rec우클릭> new > Android Resource Directory > Resource type : menu 네비게이션 뷰 전용 폴더 생성하여 rec > menu우클릭 > new > Menu Resouce File > File name : navi_menu
먼저, "접근성","이메일","메시지" 카테고리를 만든다. 무료 이미지 사이트 이용도 가능하나 안드로이드 스튜디오 내에서 자체 제공하는 이미지로 간단하게 만들 수 있다. drawable > new > vector Asset > clip Art 선택
<group android: checkableBehavior = "single">
<item android: id "@+id/access"> //accest icon을 쓰기 위함
android:icon = "@drawable/ic_accessibility_black_24dp"
android:title = "접근성"/>
<item android: id "@+id/email">
android:icon = "@drawable/ic_email_black_24dp"
android:title = "이메일"/>
<item android: id "@+id/message">
android:icon = "@drawable/ic_send_black_24dp"
android:title = "메시지"/>
</group>
네비게이션 뷰 메뉴를 완성 후, 네비게이션 뷰 메뉴를 선택할 수 있는 버튼을 layout > activity_main.xml 에서 만든다.
Component Tree의 constrainlayout -> drawerlayout 변경. constrainlayout을 drawerlayout 밑으로 끌어오고, textview는 constrainlayout 밑으로 넣음으로써 constrainlayout에 속해있는 textview 사용가능하게 한다. 아까와 같은 방법으로 네비게이션 바 아이콘을 설정한다.
위의 그림을 살펴보면 처음 만들어 놓은 3개의 이미지가 방금 만든 메뉴를 가려놔서 그레비티 정렬 속성을 통해 화면밖으로 밀어낸다. constrainlayout 끝나는 꺽쇠(/>)와 drawerlayout 사이에 <navigation> 추가한다.
<com.google.android.material.navigation.NavigationView
androud: id = "@+id_naviView"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_gravity = "start"
app: menu = "@menu/navi_menu" />
<MainActivity.kt> 에서 네비게이션 뷰를 클릭 시, "접근성","이메일","메세지" 메뉴가 나올 수 있게 구현할 차례이다. 그 전에 앞서 class MainActivity : AppCompatActivity() 옆에 NavigationView.OnNavigationSalectedListner{} 을 넣어 네비게이션 뷰를 선택하였을 때 아이템들을 Salected할 수 있는 Listner을 만들어야 한다.
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationSalectedListner{
override fun OnCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
override fun onNavigationItemSelected(item: MenuItem): Boolean{
when(item.itemId)
{
R.id.access -> Toast.makeText(applicationContext, "접근성", Toast.LENGTH_SHORT).show()
R.id.email -> Toast.makeText(applicationContext, "이메일", Toast.LENGTH_SHORT).show()
R.id.message -> Toast.makeText(applicationContext, "메세지", Toast.LENGTH_SHORT).show()
}
layout.drawer.closeDrawers()
return false
}
빨간색 전구 모양이 뜨는 곳을 Alt+Enter(Implement members) 처리 시 override fun onNavigationItemSelected 네비게이션 메뉴 아이템을 클릭 시 수행하는 구문이 형성된다. 네비게이션 메뉴는 클릭될 때 마다 아이템 값이 형성되는데 이를 when 구문으로 끌고와 메뉴 클릭 시 토스트 메시지를 띄울 수 있는 코드를 작성한다. 또한, 토스트 메시지를 띄우는게 다가 아닌 메시지를 띄우면서 layout.drawer.closeDrawers() 네비게이션 뷰를 닫아주어야 한다.
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationSalectedListner{
override fun OnCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn_navi.setOnClickListener{
layout.drawer.openDrawer(GravityCompat.START)
}
}
override fun onNavigationItemSelected(itemL MenuItem): Boolean{
when(item.itemId)
{
R.id.access -> Toast.makeText(applicationContext, "접근성", Toast.LENGTH_SHORT).show()
R.id.email -> Toast.makeText(applicationContext, "이메일", Toast.LENGTH_SHORT).show()
R.id.message -> Toast.makeText(applicationContext, "메세지", Toast.LENGTH_SHORT).show()
}
layout.drawer.closeDrawers()
return false
}
마지막으로 네비게이션 메뉴 아이템에 클릭 속성을 부여하면 된다. btn_navi.setOnClickListener{layout.drawer.openDrawer(GravityCompat.START)}
//start = left , end = right 방향
여기까지 작성하여 build를 하게 되면 네비게이션 아이콘을 클릭 후 메뉴가 나오고 해당 메뉴를 눌렀을 때, 토스트 메시지가 뜨게 되지면 앱 백 버튼을 누르면 원래 영역으로 돌아오는 것이 아니라 앱 자체가 종료된다. 우리는 onBackPressed()을 사용하여 일반 백버튼 구문 실행할 수 있다. Ctrl + O : 추천 오버라이드 메소스 override Members > onBackPressed() 클릭
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationSalectedListner{
override fun OnCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn_navi.setOnClickListener{
layout.drawer.openDrawer(GravityCompat.START)
}
naviView.setNavigationItemSelectedListener(this)
}
override fun onNavigationItemSelected(itemL MenuItem): Boolean{
when(item.itemId)
{
R.id.access -> Toast.makeText(applicationContext, "접근성", Toast.LENGTH_SHORT).show()
R.id.email -> Toast.makeText(applicationContext, "이메일", Toast.LENGTH_SHORT).show()
R.id.message -> Toast.makeText(applicationContext, "메세지", Toast.LENGTH_SHORT).show()
}
layout.drawer.closeDrawers()
return false
}
override fun onBackPressed(){
if (layout_drawer.isDrawerOpen(GravityCompat.START))
{
layout_drawer.CloseDrawers()
}
else
{
super.onBackpressed()
}
}
}
if 문을 사용하여 layout_drawer가 start방향으로 오픈이 되어 있으면 layout_drawer.CloseDrawers() 닫아달라는 조건을 건다. 여기까지가 onBackPressed()역할이고, else로 super.onBackpressed() finish 역할을 넣어 앱 실행 종료되게 한다.
'Android' 카테고리의 다른 글
Android studio_ 6. RecyclerView (0) | 2024.02.26 |
---|---|
Android studio_ 5. Shared Preferences (0) | 2024.02.21 |
Android studio_ 3. ListView, GridView (1) | 2024.02.09 |
Android studio_ 2. Toast 메시지 (0) | 2024.01.31 |
Android studio_ 1. Activity와 Intend(화면 이동) (0) | 2024.01.30 |