Android Fragments 如何使用Android Jetpack的导航组件禁用返回导航并移除Fragment上的返回箭头?

unhi4e5o  于 11个月前  发布在  Android
关注(0)|答案(2)|浏览(131)

我使用谷歌推荐的单一活动模式与Android Jetpack的导航组件。
Fragment 1是一个认证屏幕。在用户通过认证并导航到Fragment 2后,我想按下Android的后退按钮关闭应用程序,并删除应用程序栏中的后退箭头。
我已经找到了一些方法,比如onBackPressedDispatcher,可以从后按中添加/删除功能,但是没有任何方法可以删除后箭头。
在从Fragment 1导航到Fragment 2时,我也尝试了app:popUpTo="@+id/firstFragment",但也不起作用。
这应该是可能的指定与一个单一的代码行。仍然试图找到。任何提示?

zengzsys

zengzsys1#

导航到fragment2时,需要从back-stack中删除fragment1

片段1

<fragment
android:id="@+id/fragment1"
android:name="packagenameforFragment1"
android:label="fragment1"
tools:layout="@layout/fragment_1" >
<action
    android:id="@+id/action_Fragment1_to_Fragment2"
    app:destination="@id/Fragment2_id"
    app:launchSingleTop="true"
    app:popUpTo="@+id/your_MainGraph_id"
    app:popUpToInclusive="true" />

字符串
然后当你从fragment1导航到fragment2时,调用这个

findNavController(fragment).navigate(R.id.action_Fragment1_to_Fragment2)


要从Fragment2中删除后退按钮,您可以使用此

在Activity onCreate()中

val appBarConfiguration = AppBarConfiguration
        .Builder(R.id.your_fragment2_id,R.id.any_other_ids_you_want)
        .build()


然后像这样设置工具栏

setupActionBarWithNavController(this, yourNavController, appBarConfiguration)

h9a6wy2h

h9a6wy2h2#

这是我的代码,你必须像我一样手动设置appBarConfiguration。

appBarConfiguration = AppBarConfiguration(setOf(
    R.id.nav_home,
    R.id.nav_safety,
    R.id.nav_myskin,
    R.id.nav_setting
  ))
setupActionBarWithNavController(navController, appBarConfiguration)

字符串
完整代码:

package limitless.android.uvindex.ui.activity

import android.content.Intent
import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import android.view.Menu
import android.view.MenuItem
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupWithNavController
import limitless.android.uvindex.R
import limitless.android.uvindex.databinding.ActivityMainBinding
import limitless.android.uvindex.utils.Utils

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityMainBinding

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

        // Get the NavController
        val navController = findNavController(R.id.nav_host_fragment_content_main)
        binding.bnv.setupWithNavController(navController)
        navController.graph = navController.navInflater.inflate(R.navigation.nav_graph)
        appBarConfiguration = AppBarConfiguration(setOf(
            R.id.nav_home,
            R.id.nav_safety,
            R.id.nav_myskin,
            R.id.nav_setting
        ))
        setupActionBarWithNavController(navController, appBarConfiguration)
    }

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

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_premium -> {
                Utils.startActivity(this, Intent(this, PremiumActivity::class.java))
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }

}


结果:Screenshot

相关问题