๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค2024 ์•ˆ๋“œ๋กœ์ด๋“œ/๐Ÿฟ ์˜ํ™” ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ์ผ์ง€

Android UI : Toolbar ์•ฑ ๋ฐ” ์ ์šฉํ•ด์ฃผ๊ธฐ

by hyeonha 2024. 4. 7.

๋ชฉ์ฐจ

    ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

    ๋ฉ”์ธ ํ™”๋ฉด์—์„œ ์•ฑ๋ฐ”์— ์•ฑ ๋กœ๊ณ ์™€ ๊ฒ€์ƒ‰, ์•Œ๋ฆผ ์•„์ด์ฝ˜์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ๋‚˜๋Š” xml ํŒŒ์ผ์—์„œ Toolbar ์œ„์ ฏ ์ถ”๊ฐ€๋ฅผ ํ†ตํ•ด UI์—์„œ ์•ฑ๋ฐ”๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ๋งŒ ํ•˜๋ฉด ์•ฑ๋ฐ”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์œผ๋‹ˆ ์•„๋‹ˆ์—ˆ๋‹ค! ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ–ˆ๊ณ  ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด์„œ ์•ฑ๋ฐ” ์‚ฌ์šฉ๋ฒ•์„ ๊ธฐ๋กํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

     

     

    ์•ฑ ๋ฐ”๋ž€?

    ์•ฑ๋ฐ”๋Š” ์ž‘์—… ๋ชจ์Œ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค ์•ฑ๋ฐ”์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค!

     

    1๏ธโƒฃ์•ฑ์— ID๋ฅผ ์ง€์ •ํ•˜๊ณ  ์•ฑ์—์„œ ์•„์šฉ์ž์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ์ „์šฉ ๊ณต๊ฐ„

    2๏ธโƒฃ๊ฒ€์ƒ‰๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์•ก์„ธ์Šค

    3๏ธโƒฃํƒญ ๋˜๋Š” ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉํ•œ ํƒ์ƒ‰ ๋ฐ ๋ทฐ ์ „ํ™˜์„ ์ง€์›

     

    Toolbar ์œ„์ ฏ์„ ํ†ตํ•ด ์•ฑ ๋ฐ” ์„ค์ •ํ•˜๊ธฐ

    1๏ธโƒฃ์•ฑ ๋ฐ”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™œ๋™์ด AppCompatActivity๋ฅผ ํ™•์žฅํ•˜๋„๋ก ํ•œ๋‹ค.

    class MainPageActivity :
        AppCompatActivity() {

     

    2๏ธโƒฃ์•ฑ์—์„œ  NoActionBar ํ…Œ๋งˆ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

    - ์ด๋ฅผ ํ†ตํ•ด ์•ฑ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ActionBar ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ ๋ฐ”๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

        <style name="Theme" parent="Theme.Material3.DayNight.NoActionBar" />

     

    3๏ธโƒฃํ™œ๋™์˜ ๋ ˆ์ด์•„์›ƒ์— Toolbar๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/tool_bar"
            style="@style/Widget.Material3.ActionBar.Solid"
            android:layout_width="0dp"
            android:layout_height="?attr/actionBarSize"
            app:layout_constraintBottom_toTopOf="@+id/tabLayout"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:menu="@menu/top_app_bar" />

     

    4๏ธโƒฃ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ํˆด๋ฐ”๋ฅผ ํ™œ๋™์˜ ์•ฑ ๋ฐ”๋กœ ์„ค์ •ํ•ด์ค€๋‹ค!

     

    ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๊ฐ€ ๋‚ด๊ฐ€ ์ œ๋Œ€๋กœ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š์•˜๋˜ ๋ถ€๋ถ„์ด๋‹ค ์ง‘์ค‘!!

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityMainPageBinding.inflate(layoutInflater)
            setContentView(binding.root)
            setSupportActionBar(binding.toolBar)

     

    ํ™œ๋™์˜ onCreate ๋ฉ”์„œ๋“œ์—์„œ setSupportActionBar( )๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ™œ๋™์˜ ํˆด๋ฐ”๋ฅผ ์ „๋‹ฌํ•ด์ฃผ์—ˆ๋‹ค.

    ์ด ๋•Œ ๋ทฐ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

    ์ด์ œ ์•ฑ์— ๊ธฐ๋ณธ ์ž‘์—… ๋ชจ์Œ ์ฆ‰ ์•ฑ๋ฐ”๊ฐ€ ์„ค์ •๋˜์—ˆ๋‹ค.


    ์•ฑ ๋ฐ”์— ์ž‘์—… ์ถ”๊ฐ€ ๋ฐ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ

    ์•ฑ ๋ฐ”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ž‘์—…์˜ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒ„ํŠผ์— ๋งž๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.


    1๏ธโƒฃ ์ž‘์—… ๋ฒ„ํŠผ ์ถ”๊ฐ€ํ•˜๊ธฐ

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/notification"
            android:icon="@drawable/ic_notification"
            app:showAsAction="always"
            android:title="notification" />
    
        <item
            android:id="@+id/search"
            android:icon="@drawable/ic_search"
            app:showAsAction="always"
            android:title="search" />
        
    </menu>

     

    ์ž‘์—… ๋ฒ„ํŠผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํƒ€ ํ•ญ๋ชฉ๋“ค์€ menu ๋ฆฌ์†Œ์Šค์—์„œ ์ •์˜๋œ๋‹ค. ์ž‘์—… ๋ชจ์Œ์— ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด res/menu/ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒˆ๋กœ์šด xml ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

    showAsAction ์†์„ฑ

    showAsAction ์†์„ฑ์„ ํ†ตํ•ด ์ž‘์—…์„ ์•ฑ ๋ฐ”์— ๋ฒ„ํŠผ์œผ๋กœ ํ‘œ์‹œํ•  ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    - ifRoom : ๊ณต๊ฐ„์ด ์žˆ์„ ๊ฒฝ์šฐ ๋ฒ„ํŠผ์œผ๋กœ ํ‘œ์‹œ, ๊ณต๊ฐ„์ด ์—†์œผ๋ฉด ๋”๋ณด๊ธฐ ๋ฉ”๋‰ด๋กœ ์ „์†ก

    - never: ํ•ญ์ƒ ๋”๋ณด๊ธฐ ๋ฉ”๋‰ด์— ํ‘œ์‹œ

     

    2๏ธโƒฃonCreateOptionsMenu ์žฌ์ •์˜ํ•ด์ฃผ๊ธฐ

    ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์ค˜์•ผ ์•ฑ ๋ฐ”์— ์ž‘์—…์ด ์ •์ƒ์ ์œผ๋กœ ๋ณด์˜€๋‹ค.

    ์ž‘์„ฑํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์•ฑ ๋กœ๊ณ ๋งŒ ๋ณด์ธ๋‹ค.

        override fun onCreateOptionsMenu(menu: Menu?): Boolean {
            menuInflater.inflate(R.menu.top_app_bar, menu)
            return true
        }

    ์ž‘์—…์— ์‘๋‹ต : ๊ฒ€์ƒ‰ ์•„์ด์ฝ˜ ํด๋ฆญ ์‹œ ๊ฒ€์ƒ‰ ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ  ! 

    ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ ๋ฐ” ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ํ™œ๋™์˜ onOptionsItemSelected( ) ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  menuItem ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํƒญํ•œ ํ•ญ๋ชฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. 

        override fun onOptionsItemSelected(item: MenuItem) =
            when (item.itemId) {
                R.id.search -> {
                    val intent = Intent(this, SearchActivity::class.java)
                    startActivity(intent)
                    true
                }
                R.id.notification -> {
                    true
                }
    
                else -> {
                    super.onOptionsItemSelected(item)
                    false
                }
            }

     

    MenuItem.getItemId() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์–ด๋–ค ํ•ญ๋ชฉ์„ ํƒญํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋ฐ˜ํ™˜๋œ id๋Š” ๋Œ€์‘ํ•˜๋Š” <item> ์š”์†Œ์˜ android:id ์†์„ฑ์— ์„ ์–ธํ•œ ๊ฐ’๊ณผ ์ผ์น˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ when(item.itemId) ๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ค item์ด ํƒญ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ item์— ๋งž๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ๋งˆ์ง€๋ง‰ else๋ฌธ์—์„œ ์‚ฌ์šฉ์ž์˜ ์ž‘์—…์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋ฉด ์Šˆํผ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. 

     

     

    ๐Ÿค”setOnMenuItemClickListener์™€ onOptionsItemSelected์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

    ๋ฒ„ํŠผ์— ์ด๋ฒคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ๊ฒ€์ƒ‰ํ•˜๋˜ ์ค‘ ์œ„์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ € ๋‘ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์ž

     

    setOnMenuItemClickListener

     ๋ฉ”๋‰ด ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์‚ดํŽด๋ณด์ž

        override fun onCreateOptionsMenu(menu: Menu?): Boolean {
            menuInflater.inflate(R.menu.top_app_bar, menu)
            val menuItem = menu?.findItem(R.id.search)
            menuItem?.setOnMenuItemClickListener {
                val intent = Intent(this, SearchActivity::class.java)
                startActivity(intent)
                true
            }
            return true
        }

     

    ์ด๋ ‡๊ฒŒ onCreateOptionsMenu ๋‚ด๋ถ€์— Menu ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!

     

    onOptionsItemSelected ๋ฉ”์„œ๋“œ

        override fun onOptionsItemSelected(item: MenuItem) =
            when (item.itemId) {
                R.id.search -> {
                    val intent = Intent(this, SearchActivity::class.java)
                    startActivity(intent)
                    true
                }
                R.id.notification -> {
                    val intent = Intent(this, NotificationActivity::class.java)
                    startActivity(intent)
                    true
                }
    
                else -> {
                    super.onOptionsItemSelected(item)
                }
            }

     

    ์ด ๋‘ ๋กœ์ง์€ search ์•„์ด์ฝ˜์— ๋Œ€ํ•ด์„œ ๊ฐ™์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค! 

     

    ๋‚˜๋Š” ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด์ฃผ๊ณ ์ž onOptionsItemSelected๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ๊ตฌํ˜„ํ•ด์ฃผ์—ˆ๋‹ค.

     

    728x90