BottomAppBar с BottomNavigationDrawer, подключенным к NavigationController - PullRequest
0 голосов
/ 04 октября 2018

Привет, я пытаюсь использовать новые компоненты арки в моем проекте.Краткое описание того, что я хочу получить:

  • Когда пользователь включен MainFragment Я хочу отобразить значок навигации (Гамбургер) на BottomAppBar.Пользователь может щелкнуть значок навигации и отобразить BottomNavigationDrawer
  • Когда пользователь выбирает какой-либо элемент меню или щелкает что-то по MainFragment, он перемещается в другой фрагмент, скажем, DebtDetailsFragment.Затем гамбургер должен быть заменен на «Стрелка назад» на NavigationController

Ниже я вставил свой код MainActivity.Когда я комментирую строку с помощью контроллера навигации, отображается значок Гамбургера и отображается BottomNavigationDrawer.

Но когда я раскомментирую эту строку, Гамбургер исчезает, потому что NavigationController ничего не знает о NavigationView, используемом вBottomNavigationDrawer.Я не использую DrawerLayout, поэтому контроллер считает, что гамбургер не нужен.

Метод setupWithNavController может управлять значком гамбургера и стрелкой назад, но я должен предоставить DrawerLayout в качестве параметра, который мне не нужениспользовать.

Документация для этого метода:

На панели инструментов также будет отображаться кнопка «Вверх», когда вы находитесь в месте без полномочий root, и значок ящика, когда вы находитесь в месте назначения root, автоматическианимация между ними.Этот метод будет вызывать [DrawerLayout.navigateUp] при нажатии на значок навигации.

Так что вопрос в том, как отобразить значок гамбургера, когда NavigationController связан с BottomAppBar, но без DrawerLayout?Я обработаю гамбургер нажатием себя в методе onOptionsItemSelected.


class MainActivity : BaseActivity() {

    @Inject
    lateinit var viewModelProvider: ViewModelProvider.Factory

    private val viewModel: MainActivityViewModel by lazy {
        ViewModelProviders.of(this, viewModelProvider).get(MainActivityViewModel::class.java)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(bottomAppBar)
        val navController = findNavController(R.id.main_nav_host_fragment)
        //bottomAppBar.setupWithNavController(navController)

        onDestroyDisposables += viewModel.uiStateObservable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(::render, Timber::e)
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.bottomappbar_menu, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        when (item?.itemId) {
            android.R.id.home -> {
                val bottomNavDrawerFragment = BottomNavigationDrawerFragment()
                bottomNavDrawerFragment.show(supportFragmentManager, bottomNavDrawerFragment.tag)
            }
        }
        return super.onOptionsItemSelected(item)
    }

    override fun onSupportNavigateUp(): Boolean {
        return findNavController(R.id.main_nav_host_fragment).navigateUp()
    }
}

Без установленного контроллера навигации:

Without setted Navigation controller

BottomNavigationDrawer

BottomNavigationDrawer

С установленным NavigationController - невидимый гамбургер.

With NavigationController

1 Ответ

0 голосов
/ 04 октября 2018

BottomAppBar никогда не должен отображать кнопку "вверх" согласно анатомии BottomAppBar - он должен отображать только значок ящика.Как видно из документации по поведению , кнопка «Вверх» должна отображаться сверху Toolbar.

. Поэтому вам никогда не следует звонить bottomAppBar.setupWithNavController(navController), а вместо этого вызывать setupWithNavController(navController), используялюбой верх Toolbar, который у вас есть.

Чтобы настроить BottomAppBar, вы должны вместо этого установить свой собственный значок ящика и обрабатывать щелчки на значке ящика самостоятельно.

Класс DrawerArrowDrawable доступен, чтобы дать вам правильную иконку ящика:

val icon = DrawerArrowDrawable(bottomAppBar.context)
bottomAppBar.navigationIcon = icon
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...