NavigationView и ActionBarDrawerToggle

С новым NavigationView по-прежнему рекомендуется использовать ActionBarDrawerToggle или это не "Материальный дизайн"? Например, раньше мы должны были скрывать элементы панели действий, когда ящик был открыт, но теперь в рекомендациях говорится, что они должны оставаться.


person Jeremy    schedule 01.06.2015    source источник


Ответы (3)


С новым NavigationView по-прежнему рекомендуется использовать ActionBarDrawerToggle

Нет, это не требуется.

Если вы посмотрите на «официальный» демонстрационный код для новой библиотеки дизайна, ActionBarDrawerToggle больше не используется, так как новые NavigationView и AppCompatActivity это действительно не нужно.

С новой библиотекой поддержки v22 вы можете удалить весь свой код ActionBarDrawerToggle и просто использовать следующее для обработки взаимодействия между NavigationDrawer и значком гамбургера ActionBar/ToolBar:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    final ActionBar actionBar = getSupportActionBar();
    actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
    actionBar.setDisplayHomeAsUpEnabled(true);
    ...
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            mDrawerLayout.openDrawer(GravityCompat.START);
            return true;
        ....
    }
    return super.onOptionsItemSelected(item);
}

Вам нужно будет предоставить свой собственный «гамбургер» (в моем примере R.drawable.ic_menu). Кроме того, приведенный выше код — это все, что нужно для открытия ящика. Случай android.R.id.home в onOptionsItemSelected() представляет кнопку ящика для гамбургеров. Он указывает на встроенный идентификатор ресурса (не что-то, что вы добавляете в XML меню), и он обрабатывается автоматически.

Кроме того, вы должны реализовать закрытие ящика, просто добавив closeDrawers() к вашему прослушивателю кликов, например:

navigationView.setNavigationItemSelectedListener(
    new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {
            // Handle menu item clicks here.
            drawerLayout.closeDrawers();
            return true;
        }
    });

closeDrawers() — это метод DrawerLayout, который заботится обо всем. Вот и все. Это весь код, который вам действительно нужен для правильной работы с навигационными ящиками. Больше никакого грязного кода для переворачивания гамбургеров и тому подобного!

Конечно, если вы действительно хотите, вы все еще можете использовать NavigationView с ActionBarDrawerToggle по-старому. Но вы, конечно, не должны.

Если вам нужны обратные вызовы ящиков

Несмотря на то, что ActionBarDrawerToggle не требуется для открытия/закрытия ящика, он все же может быть полезен для обработки дополнительных обратных вызовов (особенно если вы уже используете ActionBar). В противном случае вы можете реализовать свои собственные, используя DrawerLayout.DrawerListener или DrawerLayout.SimpleDrawerListener() для обработки других событий, связанных с открытием/закрытием.

person hungryghost    schedule 03.06.2015
comment
Что, если я использую NavigationDrawer в приложении без использования NavigationHeader? Затем я открывал ящик под панелью инструментов. Должен ли я использовать ActionBarDrawerToggle для открытия и закрытия ящика? - person ; 10.07.2015
comment
Если вы рисуете NavigationDrawer под панелью инструментов, это звучит как веская причина по-прежнему использовать ActionBarDrawerToggle. Я не думал об этом варианте использования, но похоже, что это сделал кто-то другой (см. ответ от @androidpotato7). - person hungryghost; 12.07.2015
comment
Большое тебе спасибо. Официальный документ (developer.android.com/training/implementing-navigation/) ввел меня в заблуждение и потратил впустую несколько часов. Теперь код намного проще и все работает отлично. - person Hong; 31.12.2015

С новым NavigationView по-прежнему рекомендуется использовать ActionBarDrawerToggle

Да. Они касаются двух совершенно разных аспектов навигационного ящика.

Всего в навигационном ящике обычно три компонента:

  • A DrawerLayout
  • Содержимое панели навигации
  • Способ отображения и скрытия ящика

DrawerLayout — это макет, который содержит содержимое панели навигации и содержимое вашего приложения. Это то, что позволяет вам выдвигать ящик сбоку и отображать ящик поверх содержимого вашего приложения (первый дочерний элемент DrawerLayout).

Содержимое вашего навигационного ящика (второй дочерний элемент вашего DrawerLayout) обычно представляет собой список элементов, на которые пользователь может щелкнуть. Раньше в большинстве реализаций, которые я видел, использовались ListView или RecyclerView и, возможно, какой-то заголовок. NavigationView заменяет это и используется для предоставления содержимого ящика, совместимого с материалом.

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

person Bryan Herbst    schedule 01.06.2015
comment
ActionBarDrawerToggle существует только для прослушивания открытия и закрытия ящика. Это также позволяет существовать анимации между гамбургером и стрелкой. В представлении навигации для открытия или закрытия нет необходимости. - person mthandr; 25.06.2015

Завершая другие ответы, представление навигации должно вписываться во весь экран по высоте, чтобы при открытии он скрывал значок гамбургера. Из-за этого анимация от бургера до стрелки или даже просто показ стрелки не нужна.

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

Вы можете добиться этого с помощью ActionBarDrawerToggle, даже с представлением навигации, потому что он использует тот же DrawerLayout, что и раньше. Так что у него все еще есть применение, но, конечно, не обязательное.

person mthandr    schedule 25.06.2015