【问题标题】: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);
    }
});

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

【问题讨论】:

  • 这个有什么解决办法吗?

标签: android android-toolbar android-mvvm android-navigation-graph


【解决方案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);
    

    【讨论】:

    • 嗨,每当我按下工具栏图标时,我都会在这里收到回调,即使是汉堡图标也是如此。
    猜你喜欢
    • 1970-01-01
    • 2018-09-26
    • 2021-11-26
    • 2018-12-05
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    相关资源
    最近更新 更多