NavigationDrawer + Dynamically Add Menu Item

1. 안드로이드 스튜디오 프로젝트 생성시 Navigation Drawer Activity 으로 생성된 소스코드를

수정하는 것으로 테스트 진행함 

 

주) 템플릿 생성 코드 사용시 menu > activity_main_drawer.xml 에서 정의한 

메뉴클릭 이벤트는 onNavigationItemSelected 를 사용하지 않고 

navigation > mobile_navigation.xml 에서 클릭시 이동할 fragment 를 정의하고 

메인액티비티에서 NavigationUI 를 사용해서 처리함 

 

3. menu > 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_home"
            android:icon="@drawable/ic_menu_camera"
            android:title="@string/menu_home" />
        <item
            android:id="@+id/nav_gallery"
            android:icon="@drawable/ic_menu_gallery"
            android:title="@string/menu_gallery" />
        <item
            android:id="@+id/nav_slideshow"
            android:icon="@drawable/ic_menu_slideshow"
            android:title="@string/menu_slideshow" />
        <item
            android:id="@+id/nav_tools"
            android:icon="@drawable/ic_menu_manage"
            android:title="@string/menu_tools" />
    </group>

</menu>

3. menu_image.xml - 메뉴의 우측 건수표시하기 위한 xml 파일 정의 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_vertical">
    <TextView
        android:id="@+id/textCount"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="15"
        android:layout_marginLeft="10dp"
        />
</LinearLayout>

 

4. MainActivity 

package com.sesangmansa.navigationviewdynamic;

import android.content.SharedPreferences;
import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import android.util.Log;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;

import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.core.view.GravityCompat;
import androidx.fragment.app.FragmentTransaction;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import com.google.android.material.navigation.NavigationView;
import com.sesangmansa.navigationviewdynamic.model.MenuModel;
import com.sesangmansa.navigationviewdynamic.ui.gallery.GalleryFragment;
import com.sesangmansa.navigationviewdynamic.ui.home.HomeFragment;
import com.sesangmansa.navigationviewdynamic.ui.send.SendFragment;
import com.sesangmansa.navigationviewdynamic.ui.share.ShareFragment;

import androidx.drawerlayout.widget.DrawerLayout;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity  {

    private AppBarConfiguration mAppBarConfiguration;
    DrawerLayout drawer;
    ActionBarDrawerToggle toggle;
    NavigationView navigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //toolbar
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //floatingActionButton
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        //DrawerLayout
        drawer = findViewById(R.id.drawer_layout);
        toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        //navigationView 메뉴부분
        navigationView = findViewById(R.id.nav_view);
        //navigationView.setNavigationItemSelectedListener(this); -- 아래코드 사용함 

        //메뉴 클릭이벤트 구현
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow,
                R.id.nav_tools)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);

        //dynamicMenu
        displayMenu();
    }


    //==============================================================================================
    private void displayMenu() {

        List<MenuModel> itemList = new ArrayList<>(); //샘플테이터
        itemList.add(new MenuModel(R.drawable.ic_menu_camera, "camera", "11"));
        itemList.add(new MenuModel(R.drawable.ic_menu_gallery, "gallery", "15"));
        itemList.add(new MenuModel(R.drawable.ic_menu_manage, "manage", "30"));
        itemList.add(new MenuModel(R.drawable.ic_menu_send, "send", "20"));
        itemList.add(new MenuModel(R.drawable.ic_menu_share, "share", "105"));
        itemList.add(new MenuModel(R.drawable.ic_menu_slideshow, "slideshow", "15"));

        Menu menu = navigationView.getMenu();

        //첫번째 메뉴 menu.xml 사용
        View menu_image1 = getLayoutInflater().inflate(R.layout.menu_image, null, false);
        TextView textCount1 = menu_image1.findViewById(R.id.textCount);
        textCount1.setText("+99");
        menu.getItem(0).setActionView(menu_image1);

        //sub menu - custom 메뉴
        SubMenu menu3 = menu.addSubMenu("folder");
        View menu_image;
        TextView textCount;
        for(final MenuModel m : itemList){

            String title = m.getText1();
            menu_image = getLayoutInflater().inflate(R.layout.menu_image, null, false);
            textCount = menu_image.findViewById(R.id.textCount);
            textCount.setText(m.getText2()); //카운터

            menu3.add(title)
                    .setIcon(m.getImageResource())
                    //.setActionView(R.layout.menu_counter)
                    .setActionView(menu_image)
                    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    Toast.makeText(MainActivity.this, "Clicked"  + m.getText2(), Toast.LENGTH_SHORT).show();
                    return false;
                }
            });
        }
        drawer.closeDrawers();
    }
    //==============================================================================================


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /*
    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }
     */



    @Override
    public void onBackPressed() {
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        }
        else {
            super.onBackPressed();
        }
    }
}