使用导航组件处理工具栏返回按钮

16

我正在采用单活动方法。我有导航工具栏,每当我进入其他屏幕(片段)时,除了汉堡图标外,我将拥有返回箭头。

我想要实现的是,在按下工具栏返回箭头时弹出当前片段。

我已经尝试过

requireActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
    @Override
    public void handleOnBackPressed() {
        NavHostFragment.findNavController(EventDetailsFragment.this)
        .navigate(R.id.action_nav_event_details_to_nav_home);
    }
});

但是在那边没有收到电话,我通过在调试模式下运行应用程序进行了检查。


有什么解决方案吗? - kgandroid
4个回答

24

Activity的onCreate方法中:

navController = findNavController(R.id.my_nav_host)
//my_nav_host defined in activity xml file as id of fragment or FragmentContainerView
val appBarConfiguration = AppBarConfiguration(navController.graph)
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)

而且:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    if (item.itemId == android.R.id.home) {
        onBackPressed()
        return true
    }
    return true
}

然后在你的片段中:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val callback: OnBackPressedCallback =
        object : OnBackPressedCallback(true /* enabled by default */) {
            override fun handleOnBackPressed() {
                //do what you want here
            }
        }
    requireActivity().onBackPressedDispatcher.addCallback(this, callback)
}

1
我该如何在父活动中获取NavController访问权限? - King of Masses
1
天啊,这个导航的东西真是一团糟。 - Ridcully

1
如果您在xml中使用了自定义工具栏,您可以考虑使用以下方法。
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_chat)

    setSupportActionBar(activity_chat_toolbar)

       
   activity_chat_toolbar.setNavigationOnClickListener {
        onBackPressed() <-- custom toolbar's back press
    }

    val navHostFrag =
            supportFragmentManager.findFragmentById(R.id.chat_fragment_container_view) as NavHostFragment
    navController = navHostFrag.navController
    navController.setGraph(R.navigation.chat_nav_graph, intent.extras)

    setupActionBarWithNavController(navController)
}

// Function to check startDestination to finish() the parent activity
override fun onBackPressed() {
    if(navController.graph.startDestination == navController.currentDestination?.id) {
        finish()
    } else {
        super.onBackPressed()
    }
}

override fun onSupportNavigateUp(): Boolean {
   return navController.navigateUp() || super.onSupportNavigateUp()
}

1
将以下代码添加到父活动中 在onCreate方法中添加
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

在父活动中也添加此方法。请保留HTML标签,不要解释。
 @Override
public boolean onSupportNavigateUp() {
    return super.onSupportNavigateUp();
}

嗨,当我按下工具栏返回按钮时,我在这里得到回调。我该如何从这里检查我的当前片段或目标片段? - Shahal
在onBackPressed()方法中: Fragment oldFragment = getFragmentManager().findFragmentByTag("ADD_NEW_ANNOUNCEMENT"); if (oldFragment != null) { getFragmentManager().beginTransaction().remove(oldFragment).commit(); } - Thoriya Prahalad
我正在使用Navigation Component(Navigation Graph)。在使用它的过程中,我不需要执行Fragment oldFragment = getFragmentManager().findFragmentByTag("ADD_NEW_ANNOUNCEMENT");这样的操作。 - Shahal

-2
Toolbar toolbar = findviewbyid(R.id.toolbar);
toolbar.setnavigationonclicklistener(new view.onclicklistener(){
 code here  
});
setsupportactionbar(toolbar);

嗨,每当我按下工具栏图标(即使是汉堡包图标),我都会在这里收到回调。 - Shahal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接