С новым NavigationView
по-прежнему рекомендуется использовать ActionBarDrawerToggle
или это не "Материальный дизайн"? Например, раньше мы должны были скрывать элементы панели действий, когда ящик был открыт, но теперь в рекомендациях говорится, что они должны оставаться.
NavigationView и ActionBarDrawerToggle
Ответы (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()
для обработки других событий, связанных с открытием/закрытием.
С новым
NavigationView
по-прежнему рекомендуется использоватьActionBarDrawerToggle
Да. Они касаются двух совершенно разных аспектов навигационного ящика.
Всего в навигационном ящике обычно три компонента:
- A
DrawerLayout
- Содержимое панели навигации
- Способ отображения и скрытия ящика
DrawerLayout
— это макет, который содержит содержимое панели навигации и содержимое вашего приложения. Это то, что позволяет вам выдвигать ящик сбоку и отображать ящик поверх содержимого вашего приложения (первый дочерний элемент DrawerLayout
).
Содержимое вашего навигационного ящика (второй дочерний элемент вашего DrawerLayout
) обычно представляет собой список элементов, на которые пользователь может щелкнуть. Раньше в большинстве реализаций, которые я видел, использовались ListView
или RecyclerView
и, возможно, какой-то заголовок. NavigationView
заменяет это и используется для предоставления содержимого ящика, совместимого с материалом.
ActionBarDrawerToggle
используется для отображения значка гамбургера на панели приложений. Это то, что позволяет вашим пользователям нажимать на значок, чтобы открывать или закрывать ящик.
Завершая другие ответы, представление навигации должно вписываться во весь экран по высоте, чтобы при открытии он скрывал значок гамбургера. Из-за этого анимация от бургера до стрелки или даже просто показ стрелки не нужна.
Но при клике на текущий экран он переходит на другой фрагмент, представьте себе галерею фото и клик по фото покажет его больше, должна быть анимация от бургера до стрелки и стрелка должна остаться а при нажатии должен быть реверс анимацию к гамбургеру, чтобы можно было снова открыть окно навигации.
Вы можете добиться этого с помощью ActionBarDrawerToggle, даже с представлением навигации, потому что он использует тот же DrawerLayout, что и раньше. Так что у него все еще есть применение, но, конечно, не обязательное.