Я следовал этому руководству, чтобы создать свой фрагмент настроек. https://developer.android.com/guide/topics/ui/settings
. Для перехода на страницу настроек я использую панель действий с навигационным контроллером, и когда я нажимаю, чтобы перейти к фрагменту настроек, панель действий остаетсявиден сверху с пунктами меню, которые можно выбрать, поэтому, если я снова выберу настройки в меню панели действий, он снова раздувает фрагмент, и мне нужно дважды нажать назад, чтобы вернуться к основному действию.
Я довольно новичок, поэтому я не уверен, что лучше всего прекратить это или я делаю что-то не так с навигационным контроллером, так как я использую его впервые.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
val appBarConfiguration = AppBarConfiguration(
setOf(
R.id.navigation_home, R.id.navigation_speedtest, R.id.navigation_about
)
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
findViewById<BottomNavigationView>(R.id.nav_view)
.setupWithNavController(navController)
navController.addOnDestinationChangedListener { _, destination, _ ->
when (destination.id) {
R.id.settingsFragment -> hideBottomNav()
else -> showBottomNav()
}
}
}
private fun showBottomNav() {
nav_view.visibility = View.VISIBLE
}
private fun hideBottomNav() {
nav_view.visibility = View.GONE
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle action bar item clicks here.
val navController = findNavController(R.id.nav_host_fragment)
return when (item.itemId) {
R.id.action_credits -> {
navController.navigate(R.id.creditsActivity)
true
}
R.id.action_settings -> {
navController.navigate(R.id.settingsFragment)
true
}
else -> super.onOptionsItemSelected(item)
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/settings_container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.actionbar.settings.SettingsActivity">
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
app:iconSpaceReserved="false"
app:title="Theme">
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="switch"
app:summary="Enable dark theme."
app:title="Dark Theme" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>
<?xml version="1.0" encoding="utf-8"?>
<navigation 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/mobile_navigation"
app:startDestination="@id/navigation_home">
<fragment
android:id="@+id/navigation_home"
android:name="com.shortcircuit.online.ui.bottomnavbar.home.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/navigation_speedtest"
android:name="com.shortcircuit.online.ui.bottomnavbar.speedtest.SpeedTestFragment"
android:label="@string/title_speed_test"
tools:layout="@layout/fragment_speed_test" />
<fragment
android:id="@+id/navigation_about"
android:name="com.shortcircuit.online.ui.bottomnavbar.about.AboutFragment"
android:label="@string/title_about"
tools:layout="@layout/fragment_about" />
<activity
android:id="@+id/creditsActivity"
android:name="com.shortcircuit.online.ui.actionbar.credits.CreditsActivity"
android:label="@string/title_credits"
tools:layout="@layout/activity_settings"/>
<fragment
android:id="@+id/settingsFragment"
android:name="com.shortcircuit.online.ui.actionbar.settings.SettingsFragment"
android:label="@string/title_settings"/>
</navigation>