Как динамически генерировать элемент Навигационного ящика из xml?

Я подготовил 2 xml файла меню и поместил их в папку res / menu.

menu_beforeLogin.xml будет отображаться, если пользователь не вошел в систему. После того, как он вошел в систему, пункт меню изменится на menu_afterLogin.xml.

Я попытался вызвать InflateMenu() в моем методе onResume(), но в итоге он продолжает добавлять элементы из файла XML каждый раз, когда вызывается onResume() вместо удаления / регенерации списка меню.

Я бы предпочел проверить, вошел ли пользователь в метод onResume() или нет.

Как правильно динамически изменять список Navigation Drawer?

MainActivity.cs

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    ...
    mDrawer = FindViewById<NavigationView>(Resource.Id.navigation_drawer);
    ...
}

protected override void OnResume ()
{
    base.OnResume ();
    string token = pref.GetString (Constant.PREF_TOKEN, "");
    mDrawer.InflateMenu ( (token == "") ? Resource.Menu.menu_drawer_notLoggedIn : Resource.Menu.menu_drawer);           
    mDrawer.Invalidate ();
    ...
}

макет / main.axml

<android.support.v4.widget.DrawerLayout>
    <android.support.design.widget.CoordinatorLayout>
    ...
    </android.support.design.widget.CoordinatorLayout>
    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@drawable/menu_background"
        app:headerLayout="@layout/drawer_header" />
</android.support.v4.widget.DrawerLayout>

Рез / меню /menu_beforeLogin.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/navigation_login"
        android:icon="@drawable/navigation_login"
        android:title="@string/navigation_login" />
    <item
        android:id="@+id/navigation_notice"
        android:icon="@drawable/navigation_notice"
        android:title="@string/navigation_notice" />
    <item
        android:id="@+id/navigation_contactUs"
        android:icon="@drawable/navigation_contactUs"
        android:title="@string/navigation_contactUs" />
</menu>

Рез / меню /menu_afterLogin.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/navigation_notice"
        android:icon="@drawable/navigation_notice"
        android:title="@string/navigation_notice" />
    <item
        android:id="@+id/navigation_profile"
        android:icon="@drawable/navigation_profile"
        android:title="@string/navigation_profile" />
    <item
        android:id="@+id/navigation_contactUs"
        android:icon="@drawable/navigation_contactUs"
        android:title="@string/navigation_contactUs" />
    <item
        android:id="@+id/navigation_logout"
        android:icon="@drawable/navigation_logout"
        android:title="@string/navigation_logout" />
</menu>

1 ответ

Решение

Добавьте этот метод, чтобы очистить ваш пункт меню, прежде чем раздувать новое меню.

mDrawer.Menu.Clear ();

Другие вопросы по тегам