앱 화면에 메뉴바를 만들때 사용하는 방법 중 하나가 Android Resource Directory/menu에 관련 xml을 만들고 그것을 Activity의 onCreateOptionsMenu()
에서 inflate하는 방법이다.
코드는 이런식일 것이다.
res/menu/options_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/search"
android:icon="@drawable/round_search_24"
android:title="@string/search_hint"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom|withText" />
</menu>
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater).apply {
setContentView(root)
view = this@MainActivity
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.options_menu, menu)
(menu.findItem(R.id.search).actionView as SearchView).apply {
setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
return false
}
override fun onQueryTextChange(newText: String): Boolean {
return false
}
})
}
return true
}
}
근데 실행했을때 메뉴바가 안나오는 경우가 있다. 보통은 이 onCreateOptionsMenu()가 호출이 안되서인데 이유는 themes.xml
을 보면 알 수 있다.
res/themes/themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Base.Theme.MediaSearch" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style>
<style name="Theme.MediaSearch" parent="Base.Theme.MediaSearch" />
</resources>
NoActionBar라고 적힌 설정 때문에 onCreateOptionsMenu()가 호출이 안되는 것이다. 호출을 해주고 싶으면 아래처럼 변경해준다.
<style name="Base.Theme.MediaSearch" parent="Theme.Material3.DayNight">
이게 안드로이드 스튜디오를 업데이트하고 나서부터 NoActionBar 설정이 디폴트가 되었다. (더 자세한 것은 조사 후 추가 예정)