Мне было интересно, как я могу улучшить способ обработки доступа к пунктам меню в моем приложении.
Прежде всего, у меня есть действие входа в систему, где пользователи входят в систему, и в случае успеха она извлекает список всех элементов меню, к которым он может иметь доступ.
Затем в каждом действии мне нужно запускать метод, чтобы скрыть элементы меню, к которым у пользователя нет доступа.
Он называется 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 только один раз и сохранить эти изменения во всех действиях?




Почему бы не создать пользовательское действие, распространяющееся на AppCompatActivity, и переопределить метод onResume() для вызова вашего setMenus().
class MenuCheckerActivty: AppCompatActivity() {
override fun onResume(){
super.onResume()
setMenus(listaMenuMuestra)
}
}
Теперь, в своей обычной деятельности, расширите его до MenuCheckerActivity, созданного выше.
class MainActivtity: MenuCheckerActivity {
}
Поскольку мы переопределили onResume() из MenuCheckerActivity, функция setMenus() будет вызываться всякий раз, когда вызывается super.onResume().
Не тестировал код, но уверен, что он проясняет концепцию. Надеюсь, поможет.