Компонент навигации, контроль, когда показывать значок гамбургера или назад - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть следующее задание

class MainActivity : AppCompatActivity() {

private lateinit var drawerLayout: androidx.drawerlayout.widget.DrawerLayout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)

    drawerLayout = drawer_layout

    val navController = Navigation.findNavController(this, R.id.fragment_main_navHost)

    setSupportActionBar(toolbar)

    NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
    navView_main.setupWithNavController(navController)
}

override fun onSupportNavigateUp(): Boolean {
    return NavigationUI.navigateUp(drawerLayout,
        Navigation.findNavController(this, R.id.fragment_main_navHost))
}

override fun onBackPressed() {
    if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
        drawerLayout.closeDrawer(GravityCompat.START)
    } else {
        super.onBackPressed()
    }
}

, который, как вы можете видеть, связан с графиком навигации, а я использую навигационный ящик. Когда я перемещаюсь по элементам в ящике, я хочу сохранить значок гамбургера и изменить его на кнопку «вверх / назад» только тогда, когда я нажимаю на элемент в фрагменте или всплывающем окне, например, и гарантирую, что поведение системы отражает то, что пользователь ожидает на основе отображаемого значка. Это возможно

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Итак, я думаю, что вы можете использовать NavController.OnNavigatedListener для прослушивания показанного фрагмента, а затем обновить значок панели инструментов.

val navController = Navigation.findNavController(this, R.id.fragment_main_navHost)
navController.addOnNavigatedListener(contoller, destination -> {
   if(destination.id == R.id.fragmentTwo){
          // change the toolbar icon here
}
    })

Извините, у меня здесь нет компьютера, поэтому я пишу этот код без какой-либо IDE, в этом может быть ошибка. Но возьмите идею.

Надеюсь, это поможет вам.

0 голосов
/ 18 декабря 2018

Для управления отображением навигации вверх / назад в AppBar необходимо выполнить следующее:

1 - создайте AppBarConfiguration и передайте ему место назначения верхнего уровня и BoxLayout

    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.dest_one,
            R.id.dest_two
        ),
        drawerLayout
    )

2 - Сообщите AppBar о конфигурации и навигации. это поможет отобразить заголовок и отобразить стрелку или значок меню в ящике

setupActionBarWithNavController(navController, appBarConfig)

3- Наконец, переопределите onOptionsItemSelected и onSupportNavigateUp и расширение компонента навигации, чтобы сообщить панели приложения, как себя вести

    override fun onOptionsItemSelected(item: MenuItem)= item.onNavDestinationSelected(findNavController(R.id.my_nav_host_fragment))
        || super.onOptionsItemSelected(item)


override fun onSupportNavigateUp() = findNavController(R.id.my_nav_host_fragment).navigateUp(appBarConfiguration)

Справочник Google Code Lab Navigation Навигация Codelab

0 голосов
/ 11 сентября 2018

Выполните следующие действия

1. Свяжите свой NavigationView с NavigationUI

NavigationUI.setupWithNavController(nav_view, hostFragment.navController)

2. Bind ActionBar С NavController

NavigationUI.setupActionBarWithNavController(this@NavActivity, hostFragment.navController)

3. Bind ActionBar и DrawerLayout С NavController

NavigationUI.setupActionBarWithNavController(this@NavActivity, hostFragment.navController, drawer_layout)

4. переопределить onSupportNavigateUp() в вашей активности

override fun onSupportNavigateUp(): Boolean {
    return NavigationUI.navigateUp(drawer_layout, hostFragment.navController) 
              || super.onSupportNavigateUp()
}

Пример:

class NavActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    lateinit var hostFragment: NavHostFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_nav)
        setSupportActionBar(toolbar)

        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show()
        }

        val toggle = ActionBarDrawerToggle(
                this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
        drawer_layout.addDrawerListener(toggle)
        toggle.syncState()

        nav_view.setNavigationItemSelectedListener(this)

        hostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment    
        NavigationUI.setupWithNavController(nav_view, hostFragment.navController)    
        NavigationUI.setupActionBarWithNavController(this@NavActivity, hostFragment.navController)    
        NavigationUI.setupActionBarWithNavController(this@NavActivity, hostFragment.navController, drawer_layout)    
    }

    override fun onBackPressed() {
        if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
            drawer_layout.closeDrawer(GravityCompat.START)
        } else {
            super.onBackPressed()
        }
    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(drawer_layout, hostFragment.navController) || super.onSupportNavigateUp()
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.nav, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        when (item.itemId) {
            R.id.action_settings -> return true
            else -> return super.onOptionsItemSelected(item)
        }
    }

    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        // Handle navigation view item clicks here.
        drawer_layout.closeDrawer(GravityCompat.START)
        return true
    }
}

выход

Фрагмент дома:

Домашний фрагмент

Фрагмент второй:

Фрагмент второй

Фрагмент дерева:

Дерево фрагментов

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