Intereting Posts
Не удается запустить контрольно-измерительные тесты после ввода данных Установка учетных данных в веб-обозревателе Android с использованием защищенного соединения HTTPS Когда необходимо использовать singleTop launchMode в виджетах или приложениях Android? Кнопка входа в панель действий Android Меню скинов Android Как запустить код в потоке пользовательского интерфейса в тесте Android JUnit без Activity? Android Studio «Не удалось сохранить настройки плагина» Android: есть произвольный просмотр слайда под другим представлением, как и клавиатура программного обеспечения Как использовать функцию overscroll для просмотра? Как найти список приложений, к которым пользователь обращается в Интервал, используя фоновое задание? Android: есть ли способ получить размер объекта RemoteViews? Android-Gradle: возникла проблема настройки root-проекта Получить массив KEYS для каждого элемента под jsonarray Андроид Удалить загрузчик в SwipeRefreshLayout

Как создать пользовательский навигационный ящик в android

Привет, я пытаюсь создать навигационный ящик, похожий на gmail app navigation drawer. Я следую за сайтом разработчика, но он указывает только на базовую реализацию. Но мне нужно настроить навигацию в соответствии со своими спецификациями.

  1. Мне нужно добавить заголовок для категоризации элемента списка в Drawer
  2. Мне нужен переключатель, чтобы выбрать некоторые из моих опций

Как я могу это сделать?

Solutions Collecting From Web of "Как создать пользовательский навигационный ящик в android"

Учебник Android Custom Navigation Drawer содержит базовый и настраиваемый проект. Последний показывает, как настроить навигационный ящик, как показано на скриншоте:

NavigationDrawerCustom

Исходный код проектов доступен для загрузки.


Это также проект Navigation Drawer – Live-O …

Навигационный ящик - Live-O

Исходный код проекта доступен на GitHub.


Библиотека MaterialDrawer предназначена для обеспечения максимально простой реализации навигационного ящика для вашего приложения. Он обеспечивает большое количество настроек в ящике, а также включает в себя простой в использовании заголовок, который можно использовать как AccountSwitcher.

Демоверсия библиотеки MaterialDrawer


Обратите внимание, что Android Studio тем временем имеет проект шаблона для создания активности навигационного ящика, как показано на скриншоте.

Активность навигационного ящика

Этот репозиторий отслеживает изменения, внесенные в шаблон.

Более легким решением для меня было:

Соображения:

  • Для этого решения требуется автономная активность навигационного ящика, предоставляемая Android Studio.
  • Классы DrawerItem , CustomDrawerAdapter и layout custom_drawer_item.xml были взяты из этого урока .

1. Создайте этот класс для упаковки пользовательского элемента ящика:

 public class DrawerItem { String ItemName; int imgResID; public DrawerItem(String itemName, int imgResID) { super(); ItemName = itemName; this.imgResID = imgResID; } public String getItemName() { return ItemName; } public void setItemName(String itemName) { ItemName = itemName; } public int getImgResID() { return imgResID; } public void setImgResID(int imgResID) { this.imgResID = imgResID; } } 

2. Создайте собственный макет (custom_drawer_item.xml) для элементов вашего ящика:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/itemLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:orientation="vertical" android:layout_marginTop="0dp" android:background="?android:attr/activatedBackgroundIndicator"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:minHeight="55dp"> <ImageView android:id="@+id/drawer_icon" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/drawer_itemName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginBottom="1dp" android:layout_marginTop="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="#DADADC"> </View> </LinearLayout> </RelativeLayout> 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/itemLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:orientation="vertical" android:layout_marginTop="0dp" android:background="?android:attr/activatedBackgroundIndicator"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:minHeight="55dp"> <ImageView android:id="@+id/drawer_icon" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/drawer_itemName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginBottom="1dp" android:layout_marginTop="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="#DADADC"> </View> </LinearLayout> </RelativeLayout> 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/itemLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:orientation="vertical" android:layout_marginTop="0dp" android:background="?android:attr/activatedBackgroundIndicator"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:minHeight="55dp"> <ImageView android:id="@+id/drawer_icon" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/drawer_itemName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginBottom="1dp" android:layout_marginTop="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="#DADADC"> </View> </LinearLayout> </RelativeLayout> 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/itemLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:orientation="vertical" android:layout_marginTop="0dp" android:background="?android:attr/activatedBackgroundIndicator"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:minHeight="55dp"> <ImageView android:id="@+id/drawer_icon" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/drawer_itemName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginBottom="1dp" android:layout_marginTop="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="#DADADC"> </View> </LinearLayout> </RelativeLayout> 

3. Создайте свой пользовательский адаптер:

 import java.util.List; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem> { Context context; List<DrawerItem> drawerItemList; int layoutResID; public CustomDrawerAdapter(Context context, int layoutResourceID, List<DrawerItem> listItems) { super(context, layoutResourceID, listItems); this.context = context; this.drawerItemList = listItems; this.layoutResID = layoutResourceID; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub DrawerItemHolder drawerHolder; View view = convertView; if (view == null) { LayoutInflater inflater = ((Activity) context).getLayoutInflater(); drawerHolder = new DrawerItemHolder(); view = inflater.inflate(layoutResID, parent, false); drawerHolder.ItemName = (TextView)view.findViewById(R.id.drawer_itemName); drawerHolder.icon = (ImageView) view.findViewById(R.id.drawer_icon); view.setTag(drawerHolder); } else { drawerHolder = (DrawerItemHolder) view.getTag(); } DrawerItem dItem = (DrawerItem) this.drawerItemList.get(position); drawerHolder.icon.setImageDrawable(view.getResources().getDrawable( dItem.getImgResID())); drawerHolder.ItemName.setText(dItem.getItemName()); return view; } private static class DrawerItemHolder { TextView ItemName; ImageView icon; } } 

4. В автогенерированном классе NavigationDrawerFragment onCreateView замените автогенерированный адаптер следующим образом:

 ArrayList<DrawerItem> dataList = new ArrayList<DrawerItem>(); dataList.add(new DrawerItem(getString(R.string.title_section1), R.drawable.ic_action_1)); dataList.add(new DrawerItem(getString(R.string.title_section2), R.drawable.ic_action_2)); dataList.add(new DrawerItem(getString(R.string.title_section3), R.drawable.ic_action_3)); mDrawerListView.setAdapter(new CustomDrawerAdapter( getActivity(), R.layout.custom_drawer_item, dataList)); 

Помните, замените R.string.title_sectionN и R.drawable.ic_action_N для своих собственных ресурсов.

Я использовал ниже макет и смог создать пользовательский макет в режиме навигации.

 <android.support.design.widget.NavigationView android:id="@+id/navi_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start|top" android:background="@color/navigation_view_bg_color" app:theme="@style/NavDrawerTextStyle"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/drawer_header" /> <include layout="@layout/navigation_drawer_menu" /> </LinearLayout> </android.support.design.widget.NavigationView> 

Вы можете легко настроить ящик навигации Android, как только вы узнаете, как это реализовано. Вот хороший учебник, в котором вы можете настроить его.

Это будет структура вашего mainXML:

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- Framelayout to display Fragments --> <FrameLayout android:id="@+id/frame_container" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- Listview to display slider menu --> <ListView android:id="@+id/list_slidermenu" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="right" android:choiceMode="singleChoice" android:divider="@color/list_divider" android:dividerHeight="1dp" android:listSelector="@drawable/list_selector" android:background="@color/list_background"/> </android.support.v4.widget.DrawerLayout> 1 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- Framelayout to display Fragments --> <FrameLayout android:id="@+id/frame_container" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- Listview to display slider menu --> <ListView android:id="@+id/list_slidermenu" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="right" android:choiceMode="singleChoice" android:divider="@color/list_divider" android:dividerHeight="1dp" android:listSelector="@drawable/list_selector" android:background="@color/list_background"/> </android.support.v4.widget.DrawerLayout> 

Вы можете настроить это представление по своему вкусу, добавив заголовок. И радиолюбители.

Мне нужно добавить заголовок для категоризации элемента списка в Drawer

Настройте listView или используйте expandableListView

Мне нужен переключатель, чтобы выбрать некоторые из моих опций

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

Если вы используете Android Studio он предоставляет очень простой инструмент для создания Activity с ящиком навигации.

Щелкните правой кнопкой мыши на своем пакете, перейдите в New | Activity | Navigation Drawer Activity New | Activity | Navigation Drawer Activity

Введите описание изображения здесь

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

Если вы запустите приложение, это то, что вы получаете:

Введите описание изображения здесь

Здесь все, что вам нужно, чтобы настроить элементы в ящике и добавить контент в main content view соответствует официальной документации или любому вашему выбору.

Простой пример ящика навигации в android .

Я надеюсь, что этот блог также поможет другим.

Android Navigation Drawer using Activity Я только что последовал примеру: http://antonioleiva.com/navigation-view/

Вам просто нужно несколько настроек:

 public class MainActivity extends AppCompatActivity { public static final String AVATAR_URL = "http://lorempixel.com/200/200/people/1/"; private DrawerLayout drawerLayout; private View content; private Toolbar toolbar; private NavigationView navigationView; private ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dashboard); toolbar = (Toolbar) findViewById(R.id.toolbar); drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); initToolbar(); setupDrawerLayout(); content = findViewById(R.id.content); drawerToggle = setupDrawerToggle(); final ImageView avatar = (ImageView) navigationView.getHeaderView(0).findViewById(R.id.avatar); Picasso.with(this).load(AVATAR_URL).transform(new CircleTransform()).into(avatar); } private void initToolbar() { final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_black_24dp); actionBar.setDisplayHomeAsUpEnabled(true); } } private ActionBarDrawerToggle setupDrawerToggle() { return new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. drawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Pass any configuration change to the drawer toggles drawerToggle.onConfigurationChanged(newConfig); } private void setupDrawerLayout() { drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); navigationView = (NavigationView) findViewById(R.id.navigation_view); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { int id = menuItem.getItemId(); switch (id) { case R.id.drawer_home: Intent i = new Intent(getApplicationContext(), MainActivity.class); startActivity(i); finish(); break; case R.id.drawer_favorite: Intent j = new Intent(getApplicationContext(), SecondActivity.class); startActivity(j); finish(); break; } return true; } }); 

} Вот макет xml

 <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainActivity"> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_scrollFlags="scroll|enterAlways|snap" /> </android.support.design.widget.AppBarLayout> </FrameLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/drawer_header" app:menu="@menu/drawer"/> 

Добавить drawer.xml в меню

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/drawer_home" android:checked="true" android:icon="@drawable/ic_home_black_24dp" android:title="@string/home"/> <item android:id="@+id/drawer_favourite" android:icon="@drawable/ic_favorite_black_24dp" android:title="@string/favourite"/> ... <item android:id="@+id/drawer_settings" android:icon="@drawable/ic_settings_black_24dp" android:title="@string/settings"/> </group> 

Чтобы открыть и закрыть ящик, добавьте эти значения в string.xml

 <string name="drawer_open">Open</string> <string name="drawer_close">Close</string> 

drawer.xml

 enter code here 

 <ImageView android:id="@+id/avatar" android:layout_width="64dp" android:layout_height="64dp" android:layout_margin="@dimen/spacing_large" android:elevation="4dp" tools:src="@drawable/ic_launcher"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/email" android:layout_marginLeft="@dimen/spacing_large" android:layout_marginStart="@dimen/spacing_large" android:text="Username" android:textAppearance="@style/TextAppearance.AppCompat.Body2"/> <TextView android:id="@+id/email" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginLeft="@dimen/spacing_large" android:layout_marginStart="@dimen/spacing_large" android:layout_marginBottom="@dimen/spacing_large" android:text="username@mymail.com" android:textAppearance="@style/TextAppearance.AppCompat.Body1"/>