Как улучшить способ скрытия / отображения элементов меню NavigationView?

Мне было интересно, как я могу улучшить способ обработки доступа к пунктам меню в моем приложении.

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

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

Он называется setMenus, а список listaMenuMuestra - это список, полученный в процессе входа в систему.

public void setMenus(List<ListaMenu> listaMenuMuestra){
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        Menu nav_menu = navigationView.getMenu();
        for(int i = 0; i < listaMenuMuestra.size(); i++){
            try{
                int idMenu = getResources().getIdentifier(listaMenuMuestra.get(i).getIdMenu(), "id", getPackageName());
                nav_menu.findItem(idMenu).setVisible(true);
            }catch (Exception ex){
                Log.d("error","error");
            }
        }

Вот мой activity_main_drawer.xml. По умолчанию все элементы невидимы.

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

    <group android:checkableBehavior = "single">
        <item
            android:id = "@+id/nav_inicio"
            android:icon = "@drawable/ic_menu_home"
            android:title = "Inicio"
            android:visible = "false"/>

        <item
            android:id = "@+id/nav_ultimas"
            android:icon = "@drawable/ic_menu_send"
            android:title = "Últimas consultas"
            android:visible = "false"/>

    </group>
    <item android:title = "Estadísticas"
        android:id = "@+id/nav_tituloestadisticas"
        android:icon = "@drawable/ic_insert_chart">
        <menu>
            <item
                android:id = "@+id/nav_torta"
                android:icon = "@drawable/ic_pie_chart"
                android:title = "Gráfico de torta"
                android:visible = "false"/>
            <item
                android:id = "@+id/nav_lineal"
                android:icon = "@drawable/ic_show_chart"
                android:title = "Análisis por fechas"
                android:visible = "false"/>
        </menu>
    </item>


</menu>

«Проблема», с которой я столкнулся, заключается в том, что у меня много Activity, и мне кажется довольно странным запускать setMenus для каждого Activity.

Итак вопросы Есть ли лучший способ обрабатывать доступ к элементам меню с помощью нескольких операций и NavigationDrawer? Можно ли просто вызвать setMenus только один раз и сохранить эти изменения во всех действиях?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
146
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почему бы не создать пользовательское действие, распространяющееся на AppCompatActivity, и переопределить метод onResume() для вызова вашего setMenus().

class MenuCheckerActivty: AppCompatActivity() {

  override fun onResume(){
     super.onResume()
     setMenus(listaMenuMuestra)
  }
}

Теперь, в своей обычной деятельности, расширите его до MenuCheckerActivity, созданного выше.

class MainActivtity: MenuCheckerActivity {

}

Поскольку мы переопределили onResume() из MenuCheckerActivity, функция setMenus() будет вызываться всякий раз, когда вызывается super.onResume(). Не тестировал код, но уверен, что он проясняет концепцию. Надеюсь, поможет.

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