Я сделал рабочий ящик навигации, как показано в учебнике на сайте developer.android.com . Но теперь я хочу использовать один Навигационный ящик, который я создал в NavigationDrawer.class для нескольких действий в моем приложении.
Мой вопрос заключается в том, может ли кто-нибудь здесь создать небольшой учебник, в котором объясняется, как использовать один ящик навигации для нескольких действий.
Сначала я прочитал его в этом ящике для ответов Android на несколько действий
но это не сработало в моем проекте
public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(R.string.app_name);
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(R.string.menu);
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
layers = getResources().getStringArray(R.array.layers_array);
drawerList = (ListView) findViewById(R.id.left_drawer);
View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
drawerList.addHeaderView(header, null, false);
drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
layers));
View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
R.layout.drawer_list_footer, null, false);
drawerList.addFooterView(footerView);
drawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
map.drawerClickEvent(pos);
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
}
В этом действии я хочу иметь Навигационный ящик, поэтому я расширяю 'NavigationDrawer', а в некоторых других видах деятельности я хочу использовать тот же ящик навигации
public class SampleActivity extends NavigationDrawer {...}
Я не знаю, что изменить ...
Ответы:
Если вы хотите навигационный ящик, вы должны использовать фрагменты. Я следовал этому уроку на прошлой неделе, и он прекрасно работает:
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Вы также можете загрузить пример кода из этого учебного пособия, чтобы увидеть, как это можно сделать.
Без фрагментов:
Это ваш код BaseActivity:
Все остальные действия, для которых требуется навигационный ящик, должны расширять это действие вместо самого действия, например:
XML
Редактировать:
Я сам испытал некоторые трудности, так что вот решение, если вы получаете NullPointerExceptions. В BaseActivity измените функцию onCreate на
protected void onCreateDrawer()
. Остальные могут остаться прежними. В действиях, расширяющих BaseActivity, поместите код в следующем порядке:Это помогло мне решить мою проблему, надеюсь, это поможет!
Вот как вы можете создать навигационный ящик с несколькими действиями, если у вас есть какие-либо вопросы, не стесняйтесь задавать.
Изменить 2:
Как сказал @GregDan, вы
BaseActivity
также можете переопределитьsetContentView()
и вызвать onCreateDrawer:источник
Я нашел лучшую реализацию. Это в Google I / O 2014 .
Они используют тот же подход, что и Кевин. Если вы можете абстрагироваться от всего ненужного в приложении ввода-вывода, вы можете извлечь все, что вам нужно, и Google уверен, что это правильное использование шаблона навигационной панели. Каждое действие может иметь
DrawerLayout
свой основной макет. Интересная часть - как осуществляется переход на другие экраны. Это реализованоBaseActivity
так:Это отличается от обычного способа замены текущего фрагмента транзакцией фрагмента. Но пользователь не видит визуальной разницы.
источник
overridePendingTransitions
.Так что этот ответ опоздал на несколько лет, но кто-то может оценить его. Android предоставил нам новый виджет, который облегчает использование одного навигационного ящика с несколькими действиями.
android.support.design.widget.NavigationView является модульным и имеет собственный макет в папке меню. То, как вы его используете, заключается в следующем:
Корневой макет - это android.support.v4.widget.DrawerLayout, который содержит двух дочерних элементов:
<include ... />
оборачиваемый макет (см. 2) и android.support.design.widget.NavigationView.nav_header_main - это просто LinearLayout с ориентацией = вертикали для заголовка вашего Навигационного Рисунка.
Activity_main_drawer - это xml меню в вашем каталоге res / menu. Он может содержать элементы и группы по вашему выбору. Если вы используете AndroidStudio Gallery, мастер сделает для вас базовую галерею, и вы увидите, какие у вас есть варианты.
Макет панели приложения обычно теперь представляет собой android.support.design.widget.CoordinatorLayout, и он будет включать двух дочерних элементов: android.support.design.widget.AppBarLayout (который содержит android.support.v7.widget.Toolbar) и
<include ... >
для ваш фактический контент (см. 3).Макет контента может быть любым макетом, который вы хотите. Это макет, который содержит основное содержание действия (не включая панель навигации или панель приложения).
Теперь, во всем этом круто то, что вы можете обернуть каждое действие в эти два макета, но ваш NavigationView (см. Шаг 1) всегда указывает на activity_main_drawer (или что-то еще). Это означает, что у вас будет один и тот же (*) Навигационный ящик для всех видов деятельности.
источник
Самый простой способ повторно использовать общий блок навигации в группе действий
app_base_layout.xml
AppBaseActivity.java
источник
AppBaseActivity
иsetContentView
стандартный способ.Для тех, кто хочет сделать то, о чем просит оригинальный постер, рассмотрите возможность использования фрагментов вместо того, как сказал Кевин. Вот отличное руководство о том, как это сделать:
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer
Если вы решите использовать действия вместо фрагментов, вы столкнетесь с проблемой повторного создания навигационной панели каждый раз, когда вы переходите к новому действию. Это приводит к уродливой / медленной визуализации навигационного ящика каждый раз.
источник
Мое предложение: вообще не используйте действия, вместо этого используйте фрагменты и заменяйте их в контейнере (например, в Linear Layout), где вы показываете свой первый фрагмент.
Код доступен в учебниках по Android для разработчиков, вам просто нужно его настроить.
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Желательно, чтобы вы использовали все больше и больше фрагментов в вашем приложении, и должно быть только четыре основных действия, локальных для вашего приложения, которые вы упомянули в вашем AndroidManifest.xml, помимо внешних (например, FacebookActivity):
SplashActivity: не использует фрагмент и использует тему FullScreen.
LoginSignUpActivity: вообще не требует NavigationDrawer и никакой кнопки «назад», поэтому просто используйте обычную панель инструментов, но, как минимум, потребуется 3 или 4 фрагмента. Используется тема без действия бара
HomeActivity или DashBoard Activity: используется тема без действия бара. Здесь вам требуется блок навигации, также все последующие экраны будут фрагментами или вложенными фрагментами, вплоть до представления листа, с общим блоком. Все настройки, профиль пользователя и т. Д. Будут представлены здесь как фрагменты в этом упражнении. Фрагменты здесь не будут добавлены в задний стек и будут открываться из пунктов меню ящика. В случае фрагментов, которые требуют кнопку возврата вместо ящика, ниже есть четвертый вид деятельности.
Деятельность без ящика. В этом упражнении кнопка «Назад» сверху и фрагменты внутри будут использовать одну и ту же панель действий. Эти фрагменты будут добавлены в бэк-стек, так как там будет история переходов.
[Для получения дальнейших указаний см .: https://stackoverflow.com/a/51100507/787399 ]
Удачного кодирования!
источник
обновить этот код в базовой активности. и не забудьте включить в список действий xml.
и не используйте request () в своей деятельности. но все еще ящик не виден при нажатии на изображение .. и при перетаскивании он будет виден без элементов списка. Я много пробовал, но безуспешно. нужны тренировки для этого ...
источник
С ответом @Kevin van Mierlo вы также можете реализовать несколько ящиков. Например, меню по умолчанию, расположенное слева (начало), и дополнительное меню, расположенное справа, которое отображается только при загрузке определенных фрагментов.
Я был в состоянии сделать это.
источник
используйте это для вашего toolbar.xml
используйте это для заголовка навигации, если хотите использовать
источник
Я делаю это в Котлине так:
Действия для ящика должны наследовать это
BaseAppCompatActivity
, вызыватьsuper.onCreate
после того, как контент установлен (на самом деле, может быть перемещен в какой-то метод init) и иметь соответствующие элементы для идентификаторов в их макетеисточник
Мой ответ - просто концептуальный, без какого-либо исходного кода. Это может быть полезно для некоторых читателей, как я, чтобы понять.
Это зависит от вашего первоначального подхода к архитектуре вашего приложения. Есть в основном два подхода.
Вы создаете одно действие (базовое действие), а все остальные виды и экраны будут фрагментами. Это базовое действие содержит реализацию макетов «Ящик» и «Координатор». На самом деле это мой предпочтительный способ сделать, потому что наличие небольших автономных фрагментов сделает разработку приложений более легкой и гладкой.
Если вы начали разработку приложения с действий, по одному для каждого экрана, то вы, вероятно, создадите базовое действие, а все остальные действия будут исходить из него. Базовое действие будет содержать код для реализации в комитете и координаторе. Любое действие, для которого требуется реализация ящика, может выходить за пределы базового действия.
Я лично предпочел бы избегать использования фрагментов и действий, смешанных без какой-либо организации. Это усложняет разработку и в конечном итоге застревает. Если вы сделали это, рефакторинг вашего кода.
источник
Создайте навигационный ящик в вашей MainActivity, используя фрагмент.
Инициализируйте Навигационный ящик в MainActivity
теперь во всех других действиях, для которых вы хотите использовать тот же Навигационный ящик, поместите DrawerLayout в качестве основы и фрагмент в качестве ящика навигации. Просто установите android: имя в вашем фрагменте, указывающее на ваш фрагмент Java-файла. Вам не нужно инициализировать фрагмент в других действиях.
Вы можете получить доступ к Nav Drawer, проводя в других действиях, как в приложении Google Play Store
источник