Use material toolbar without action bar

This commit is contained in:
Kirill Kamakin
2022-11-18 22:42:56 +01:00
parent ac0eb2bfd2
commit e86b24c3f6
8 changed files with 19 additions and 54 deletions

View File

@@ -1,7 +1,6 @@
package gq.kirmanak.mealient.ui.activity package gq.kirmanak.mealient.ui.activity
import android.os.Bundle import android.os.Bundle
import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
@@ -29,8 +28,6 @@ class MainActivity : AppCompatActivity(R.layout.main_activity) {
private val binding: MainActivityBinding by viewBinding(MainActivityBinding::bind, R.id.drawer) private val binding: MainActivityBinding by viewBinding(MainActivityBinding::bind, R.id.drawer)
private val viewModel by viewModels<MainActivityViewModel>() private val viewModel by viewModels<MainActivityViewModel>()
private val title: String by lazy { getString(R.string.app_name) }
private val uiState: MainActivityUiState get() = viewModel.uiState
private val navController: NavController private val navController: NavController
get() = binding.navHost.getFragment<NavHostFragment>().navController get() = binding.navHost.getFragment<NavHostFragment>().navController
@@ -47,6 +44,7 @@ class MainActivity : AppCompatActivity(R.layout.main_activity) {
configureNavGraph() configureNavGraph()
viewModel.uiStateLive.observe(this, ::onUiStateChange) viewModel.uiStateLive.observe(this, ::onUiStateChange)
binding.navigationView.setNavigationItemSelectedListener(::onNavigationItemSelected) binding.navigationView.setNavigationItemSelectedListener(::onNavigationItemSelected)
supportActionBar?.hide()
} }
private fun configureNavGraph() { private fun configureNavGraph() {
@@ -60,8 +58,6 @@ class MainActivity : AppCompatActivity(R.layout.main_activity) {
} }
private fun configureToolbar() { private fun configureToolbar() {
setSupportActionBar(binding.toolbar)
binding.toolbar.setNavigationIcon(R.drawable.ic_toolbar)
binding.toolbar.setNavigationOnClickListener { binding.drawer.open() } binding.toolbar.setNavigationOnClickListener { binding.drawer.open() }
} }
@@ -87,21 +83,15 @@ class MainActivity : AppCompatActivity(R.layout.main_activity) {
private fun onUiStateChange(uiState: MainActivityUiState) { private fun onUiStateChange(uiState: MainActivityUiState) {
logger.v { "onUiStateChange() called with: uiState = $uiState" } logger.v { "onUiStateChange() called with: uiState = $uiState" }
supportActionBar?.title = if (uiState.titleVisible) title else null with(binding.navigationView) {
binding.navigationView.isVisible = uiState.navigationVisible isVisible = uiState.navigationVisible
val menu = binding.navigationView.menu menu.findItem(R.id.logout).isVisible = uiState.canShowLogout
menu.findItem(R.id.logout).isVisible = uiState.canShowLogout menu.findItem(R.id.login).isVisible = uiState.canShowLogin
menu.findItem(R.id.login).isVisible = uiState.canShowLogin }
invalidateOptionsMenu() binding.toolbar.menu.findItem(R.id.search_recipe_action).apply {
} isVisible = uiState.searchVisible
setupSearchItem(this)
override fun onCreateOptionsMenu(menu: Menu): Boolean { }
logger.v { "onCreateOptionsMenu() called with: menu = $menu" }
menuInflater.inflate(R.menu.main_toolbar, menu)
val searchItem = menu.findItem(R.id.search_recipe_action)
searchItem.isVisible = uiState.searchVisible
setupSearchItem(searchItem)
return true
} }
private fun setupSearchItem(searchItem: MenuItem) { private fun setupSearchItem(searchItem: MenuItem) {

View File

@@ -2,7 +2,6 @@ package gq.kirmanak.mealient.ui.activity
data class MainActivityUiState( data class MainActivityUiState(
val loginButtonVisible: Boolean = false, val loginButtonVisible: Boolean = false,
val titleVisible: Boolean = true,
val isAuthorized: Boolean = false, val isAuthorized: Boolean = false,
val navigationVisible: Boolean = false, val navigationVisible: Boolean = false,
val searchVisible: Boolean = false, val searchVisible: Boolean = false,

View File

@@ -38,12 +38,7 @@ class AddRecipeFragment : Fragment(R.layout.fragment_add_recipe) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" } logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" }
activityViewModel.updateUiState { activityViewModel.updateUiState {
it.copy( it.copy(loginButtonVisible = true, navigationVisible = true, searchVisible = false)
loginButtonVisible = true,
titleVisible = false,
navigationVisible = true,
searchVisible = false,
)
} }
viewModel.loadPreservedRequest() viewModel.loadPreservedRequest()
setupViews() setupViews()

View File

@@ -32,12 +32,7 @@ class AuthenticationFragment : Fragment(R.layout.fragment_authentication) {
logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" } logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" }
binding.button.setOnClickListener { onLoginClicked() } binding.button.setOnClickListener { onLoginClicked() }
activityViewModel.updateUiState { activityViewModel.updateUiState {
it.copy( it.copy(loginButtonVisible = false, navigationVisible = false, searchVisible = false)
loginButtonVisible = false,
titleVisible = true,
navigationVisible = false,
searchVisible = false
)
} }
viewModel.uiState.observe(viewLifecycleOwner, ::onUiStateChange) viewModel.uiState.observe(viewLifecycleOwner, ::onUiStateChange)
} }

View File

@@ -34,12 +34,7 @@ class BaseURLFragment : Fragment(R.layout.fragment_base_url) {
binding.button.setOnClickListener(::onProceedClick) binding.button.setOnClickListener(::onProceedClick)
viewModel.uiState.observe(viewLifecycleOwner, ::onUiStateChange) viewModel.uiState.observe(viewLifecycleOwner, ::onUiStateChange)
activityViewModel.updateUiState { activityViewModel.updateUiState {
it.copy( it.copy(loginButtonVisible = false, navigationVisible = false, searchVisible = false)
loginButtonVisible = false,
titleVisible = true,
navigationVisible = false,
searchVisible = false
)
} }
} }

View File

@@ -58,12 +58,7 @@ class DisclaimerFragment : Fragment(R.layout.fragment_disclaimer) {
} }
viewModel.startCountDown() viewModel.startCountDown()
activityViewModel.updateUiState { activityViewModel.updateUiState {
it.copy( it.copy(loginButtonVisible = false, navigationVisible = false, searchVisible = false)
loginButtonVisible = false,
titleVisible = true,
navigationVisible = false,
searchVisible = false
)
} }
} }
} }

View File

@@ -49,12 +49,7 @@ class RecipesListFragment : Fragment(R.layout.fragment_recipes_list) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" } logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" }
activityViewModel.updateUiState { activityViewModel.updateUiState {
it.copy( it.copy(loginButtonVisible = true, navigationVisible = true, searchVisible = true)
loginButtonVisible = true,
titleVisible = false,
navigationVisible = true,
searchVisible = true,
)
} }
setupRecipeAdapter() setupRecipeAdapter()
hideKeyboardOnScroll() hideKeyboardOnScroll()

View File

@@ -10,8 +10,7 @@
<androidx.coordinatorlayout.widget.CoordinatorLayout <androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:fitsSystemWindows="true">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/toolbar_holder" android:id="@+id/toolbar_holder"
@@ -24,7 +23,9 @@
style="@style/Widget.MaterialComponents.Toolbar.Primary" style="@style/Widget.MaterialComponents.Toolbar.Primary"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?actionBarSize" android:layout_height="?actionBarSize"
app:layout_scrollFlags="scroll|snap|enterAlways" /> app:layout_scrollFlags="scroll|snap|enterAlways"
app:menu="@menu/main_toolbar"
app:navigationIcon="@drawable/ic_toolbar" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<androidx.fragment.app.FragmentContainerView <androidx.fragment.app.FragmentContainerView