2015-10-07 2 views
1

В моем приложении я загружаю ящик для навигации со следующим .xml. В первой группе у меня есть предмет для current_device и other_device. Существует возможность иметь несколько других устройств, перечисленных здесь, но это определяется во время выполнения с вызовом api. Есть ли способ динамически добавлять элементы в этот .xml? Или лучший способ сделать это. сЭлементы ящика навигации Runtime

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

<group 
    android:id="@+id/nav_devices_group" 
    android:checkableBehavior="single"> 

    <item 
     android:id="@+id/nav_current_device" 
     android:icon="@drawable/common_full_open_on_phone" 
     android:title="@string/nav_current_device" /> 

    <item 
     android:id="@+id/nav_other_device" 
     android:icon="@drawable/common_full_open_on_phone" 
     android:title="@string/nav_devices" /> 

</group> 

<group> 
    <item 
     android:id="@+id/nav_settings" 
     android:icon="@drawable/ic_setting_dark" 
     android:title="@string/nav_settings" /> 

    <item 
     android:id="@+id/nav_about" 
     android:icon="@android:drawable/ic_dialog_info" 
     android:title="@string/nav_about" /> 
</group> 

</menu> 

Навигационный макет ящика ниже:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:openDrawer="start"> 

<include 
    layout="@layout/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<android.support.design.widget.NavigationView 
    android:id="@+id/nav_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main" 
    app:menu="@menu/menu_nav_drawer" /> 

</android.support.v4.widget.DrawerLayout> 
+0

Проверьте мой ответ [http://stackoverflow.com/a/33072681/1050058](http://stackoverflow.com/a/33072681/1050058) –

ответ

1

Вот код, чтобы добавить товар.

mNavigationView = (NavigationView) context.findViewById(R.id.navigationView); 
Menu menu = mNavigationView.getMenu(); 
SubMenu devicesMenu = menu.addSubMenu(Menu.NONE, DEVICES_MENU_ID, Menu.NONE, "Devices"); 
//You get your deviceId (nexus5Id, nexus6Id and so on) from your API call 
//You should see deviceId in your code, from a loop or network callback 
//in place of my hardcoded devices ids 
devicesMenu.add(DEVICES_MENU_ID, nexus5Id, "Nexus 5"); 
devicesMenu.add(DEVICES_MENU_ID, nexus6Id, "Nexus 6"); 
devicesMenu.add(DEVICES_MENU_ID, nexus5XId, "Nexus 5X"); 
devicesMenu.add(DEVICES_MENU_ID, nexus6PId, "Nexus 6P"); 

Чтобы получить пункт меню, чтобы установить его на проверку, изменить его значок или что-нибудь:

MenuItem device = devicesMenu.find(deviceId); 
devicesMenu.setChecked(true); 

Чтобы удалить элемент:

devicesMenu.remove(deviceId); 

Обратите внимание, что SubMenu расширяет меню. Я предлагаю вам проверить документацию Menu и MenuItem.

EDIT

Как ваши идентификаторы не подходят для Int формат, требуемый MenuItems, я думаю, вы должны добавить Scrollview/NestedScrollView в месте вашего NavigationMenu, добавьте классический TextView с drawableLeft для не элементов группы, и exandable View (LinearLayout, например) с группой TextView, которые расширяются при нажатии, показывая RecyclerView, содержащий все ваши устройства.

Таким образом, вы можете использовать пользовательский адаптер и управлять своими идентификаторами так, как вам хочется (лучше всего использовать длинные идентификаторы в RecyclerView (и устаревшем ListView)).

Однако я не уверен, что добавление всех устройств в NavigationDrawer (будь то стандартный API с меню или с RecyclerView) является хорошей практикой, поскольку устройства могут быть очень длинными, верно? Для большой коллекции устройств я бы использовал стандартный негруппированный элемент «Устройства» в моем приложении NavigationDrawer, а затем, показывая пользователю либо поисковый запрос, либо список с устройствами.

+0

где у вас есть 'nexus5ID', я бы использовал что-то вроде 'd2bc6f797fd07614'. Однако он ищет «int itemID».Можно ли преобразовать фактический идентификатор устройства в int? – ENG618

+0

я это 'deviceMenu.add (R.id.nav_devices, Integer.parseInt ("d2bc6f797fd07614"), Menu.NONE, "Nexus");' , но это вызывает исключение: 'Вызванный: java.lang .NumberFormatException: Invalid int: "d2bc6f797fd07614" ' – ENG618

+0

Я думаю, что вы не можете использовать меню, если у вас есть такие идентификаторы, как преобразование их в байты, и кастинг, вероятно, не будет вписываться в int capacity, вам понадобится длинный, но он будет быть взломанным, а Menus не поддерживают его. –

0

От: How to programmatically add a submenu item to the new material design android support library

Добавление динамического меню в NavigationView в настоящее время ошибка в библиотеке Design Support. И Я сообщаю об этом отслеживать исходный код ошибки Android. Поэтому подождите, пока ошибка не будет исправлена. Но если вы хотите временное решение , вы можете это сделать. Во-первых добавить динамическое меню ..

navView = (NavigationView) findViewById(R.id.navView); 
    Menu m = navView.getMenu(); 
    SubMenu topChannelMenu = m.addSubMenu("Top Channels"); 
    topChannelMenu.add("Foo"); 
    topChannelMenu.add("Bar"); 
    topChannelMenu.add("Baz"); 

После добавления Ваше меню просто написать ниже код ..

MenuItem mi = m.getItem(m.size()-1); 
    mi.setTitle(mi.getTitle()); 

Это в настоящее время Hacky решение. Но работа для меня ...

Смежные вопросы