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();
}
}
}
'안드로이드 앱 개발' 카테고리의 다른 글
Toolbar + FloatingActionMenu (0) | 2020.02.12 |
---|---|
RecyclerView + ViewPager + TabLayout (0) | 2020.02.11 |
NavigationDrawer + ToolBar + Fragment (0) | 2020.02.11 |
RecyclerView + Realm + Swip Delete + FloatingActionButton (0) | 2020.02.11 |
RecyclerView + SQLite + Swip Delete + FloatingActionButton (0) | 2020.02.11 |