Обработать кнопку "Назад" на панели инструментов с помощью компонента "Навигация"

Я следую единовременному подходу. У меня есть панель инструментов навигации, всякий раз, когда я перехожу к другим экранам (фрагментам) вместо значка гамбургера, у меня будет стрелка назад.

Я хочу достичь того, чтобы вывести мой текущий фрагмент, используя действие при нажатии стрелки назад на панели инструментов.

я пробовал

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

Но не получая звонка, я проверил, запустив приложение в режиме отладки.


person Shahal    schedule 23.10.2019    source источник
comment
Любое решение этого?   -  person kgandroid    schedule 23.07.2020


Ответы (4)


в 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)
}
person Hadi Ahmadi    schedule 22.05.2020
comment
как я получу доступ к navController в родительской активности? - person King of Masses; 26.11.2020

Добавьте этот код в родительскую активность

Добавить метод onCreate

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Добавьте этот метод также в родительскую активность

 @Override
public boolean onSupportNavigateUp() {
    return super.onSupportNavigateUp();
}
person Thoriya Prahalad    schedule 23.10.2019
comment
используйте треску для создания фрагмента. private void addNewFragment () {addNewAnnouncementsFragment = AddNewAnnouncementsFragment.newInstance (AnnouncementsActivity.this); FragmentTransaction ft = getFragmentManager (). BeginTransaction (); ft.replace (R.id.fragment_frame, addNewAnnouncementsFragment, ADD_NEW_ANNOUNCEMENT); ft.commit (); } - person Thoriya Prahalad; 23.10.2019
comment
Привет, я получаю обратный вызов здесь, когда нажимаю кнопку "Назад" на панели инструментов. Как мне проверить мой текущий фрагмент или целевой фрагмент отсюда. - person Shahal; 23.10.2019
comment
в onbackpress- ›Фрагмент oldFragment = getFragmentManager (). findFragmentByTag (ADD_NEW_ANNOUNCEMENT; if (oldFragment! = null) {getFragmentManager (). beginTransaction (). remove (oldFragment) .commit ();} - person Thoriya Prahalad; 23.10.2019
comment
Я использую компонент навигации (навигационный график). Мне не нужно делать Fragment oldFragment = getFragmentManager().findFragmentByTag("ADD_NEW_ANNOUNCEMENT"); что-либо из этого, пока я использую это. - person Shahal; 23.10.2019

Если вы используете custom toolbar в своем 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()
}
person Teo    schedule 13.03.2021

person    schedule
comment
Привет, я получаю обратный вызов здесь всякий раз, когда я нажимаю значки на панели инструментов даже для значка гамбургера. - person Shahal; 23.10.2019