使用导航组件处理工具栏后退按钮

Posted

技术标签:

【中文标题】使用导航组件处理工具栏后退按钮【英文标题】:Handle Toolbar back button with Navigation component 【发布时间】:2020-02-19 08:08:00 【问题描述】:

我遵循单一活动方法。我有导航工具栏,每当我转到其他屏幕(片段)而不是汉堡图标时,我都会有后退箭头。

我想要实现的是,使用按下工具栏后退箭头的动作弹出我当前的片段。

我试过了

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);
    
);

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

【问题讨论】:

这个有什么解决办法吗? 【参考方案1】:

Activity 上创建:

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)

【讨论】:

如何在父活动中获得 navController 访问权限?【参考方案2】:

在父活动中添加此代码

添加 onCreate 方法

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

在父活动中也添加此方法

 @Override
public boolean onSupportNavigateUp() 
    return super.onSupportNavigateUp();

【讨论】:

使用 cod 创建片段。私人无效 addNewFragment() addNewAnnouncementsFragment = AddNewAnnouncementsFragment.newInstance(AnnouncementsActivity.this); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.fragment_frame, addNewAnnouncementsFragment, "ADD_NEW_ANNOUNCEMENT"); ft.commit(); 嗨,我在按下工具栏后退按钮时收到回调。我如何从这里检查我当前的 Fragment 或 Destination Fragment。 in onbackpress-> Fragment oldFragment = getFragmentManager().findFragmentByTag("ADD_NEW_ANNOUNCEMENT"; if (oldFragment != null) getFragmentManager().beginTransaction().remove(oldFragment).commit(); 我正在使用导航组件(导航图)。在使用它时,我不需要做Fragment oldFragment = getFragmentManager().findFragmentByTag("ADD_NEW_ANNOUNCEMENT"); 中的任何一个。【参考方案3】:

如果您在 xml 中使用custom toolbar,您可以考虑使用以下方法

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()

【讨论】:

【参考方案4】:
Toolbar toolbar = findviewbyid(R.id.toolbar);
toolbar.setnavigationonclicklistener(new view.onclicklistener()
 code here  
);
setsupportactionbar(toolbar);

【讨论】:

嗨,每当我按下工具栏图标时,我都会在这里收到回调,即使是汉堡图标也是如此。

以上是关于使用导航组件处理工具栏后退按钮的主要内容,如果未能解决你的问题,请参考以下文章

从android中的片段管理工具栏的导航和后退按钮

Android - 将 ActionBar 后退按钮切换为导航按钮

Android导航组件后退按钮不起作用

工具栏正在删除 NavigationView 中的后退按钮

本机脚本 |在android后退按钮导航后调用ngOnInit

iOS:如何使用按钮切换 Tableview 行?