Google NavigationView
은 메뉴 리소스를 사용하여 서랍을 매우 쉽게 만들 수있는 디자인 지원 라이브러리 버전 22.2.0을 도입했습니다 .
두 항목 사이에 간단한 구분선을 만들려면 어떻게해야합니까? 항목을 그룹화하지 못했습니다. 하위 항목 섹션을 만들면 구분선이 만들어 지지만 원하지 않는 제목이 필요합니다.
도움을 주시면 감사하겠습니다.
답변
당신이해야 할 일은 고유 ID로를 정의하는 것 group
입니다. 그룹이 다른 ID를 가지고 있다면 구현을 확인하여 분배기를 만들 것입니다.
구분자를 작성하는 예제 메뉴 :
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<group android:id="@+id/grp1" android:checkableBehavior="single" >
<item
android:id="@+id/navigation_item_1"
android:checked="true"
android:icon="@drawable/ic_home"
android:title="@string/navigation_item_1" />
</group>
<group android:id="@+id/grp2" android:checkableBehavior="single" >
<item
android:id="@+id/navigation_item_2"
android:icon="@drawable/ic_home"
android:title="@string/navigation_item_2" />
</group>
</menu>
답변
이와 같이 drawable drawer_item_bg.xml을 만듭니다.
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle" >
<solid android:color="#F4F4F4" />
</shape>
</item>
<item android:top="-2dp" android:right="-2dp" android:left="-2dp">
<shape>
<solid android:color="@android:color/transparent" />
<stroke
android:width="1dp"
android:color="#EAEAEA" />
</shape>
<!--
android:dashGap="10px"
android:dashWidth="10px"
-->
</item>
</layer-list>
app : itemBackground = “@ drawable / drawer_item_bg” 로 NavigationView에 추가하십시오 .
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="#F4F4F4"
android:layout_gravity="start"
android:fitsSystemWindows="false"
app:menu="@menu/activity_main_drawer"
app:itemBackground="@drawable/drawer_item_bg"/>
답변
간단한 DeviderItemDecoration 추가 :
NavigationView navigationView = (NavigationView) findViewById(R.id.navigation);
NavigationMenuView navMenuView = (NavigationMenuView) navigationView.getChildAt(0);
navMenuView.addItemDecoration(new DividerItemDecoration(MainActivity.this,DividerItemDecoration.VERTICAL));
다음과 같이 보입니다 :
답변
XML을 사용하여 메뉴 항목 배경을 설정하여 쉽게 디바이더를 추가 할 수 있습니다. app:itemBackground
<android.support.design.widget.NavigationView
android:id="@id/drawer_navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:menu="@menu/all_navigation_menu"
app:itemIconTint="@color/colorPrimary"
app:itemBackground="@drawable/bg_drawer_item"
android:background="@color/default_background"/>
그리고 배경으로 LayerDrawable 을 사용 하십시오. 클릭에 대한 머티리얼 디자인 리플 오버레이를 유지합니다.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/white"/>
</shape>
</item>
<item android:left="@dimen/activity_horizontal_margin">
<shape android:shape="rectangle">
<solid android:color="@color/divider"/>
</shape>
</item>
<item android:bottom="1dp">
<shape android:shape="rectangle">
<solid android:color="@color/white"/>
</shape>
</item>
</layer-list>
결과:
답변
여러 개의 체크 된 항목의 문제에 대해 더 나은 해결책이 있다고 생각합니다. 내 방식을 사용하면 메뉴에 새 섹션을 추가 할 때 코드 변경에 대해 걱정할 필요가 없습니다. 내 메뉴는 그룹에서 andoid : checkableBehavior = ” all “을 사용하는 것과는 달리 Jared가 작성한 허용 된 솔루션과 같습니다.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/first_section" android:checkableBehavior="all">
<item
android:id="@+id/frontpage"
android:icon="@drawable/ic_action_home_24dp_light_blue"
android:title="@string/drawer_frontpage" />
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="@string/drawer_search" />
</group>
<group android:id="@+id/second_section" android:checkableBehavior="all">
<item
android:id="@+id/events"
android:icon="@drawable/ic_maps_local_movies_24dp_light_blue"
android:title="@string/drawer_events" />
</group>
</menu>
‘all’의 checkableBehavior를 사용하면 그룹에 관계없이 단일 항목을 마음대로 확인 / 선택 취소 할 수 있습니다. 마지막으로 확인한 메뉴 항목 만 저장하면됩니다. 자바 코드는 다음과 같습니다.
private MenuItem activeMenuItem;
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// Update selected/deselected MenuItems
if (activeMenuItem != null)
activeMenuItem.setChecked(false);
activeMenuItem = menuItem;
menuItem.setChecked(true);
drawerLayout.closeDrawers();
return true;
}
답변
Nilesh의 답변과 같은 다른 그룹을 만들면 사이에 구분이 이루어 지지만 탐색 창에서 두 개의 확인 된 항목의 문제가 발생합니다.
내가 이것을 처리하는 간단한 방법은 다음과 같습니다.
public boolean onNavigationItemSelected(final MenuItem menuItem) {
//if an item from extras group is clicked,refresh NAV_ITEMS_MAIN to remove previously checked item
if (menuItem.getGroupId() == NAV_ITEMS_EXTRA) {
navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, false, true);
navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, true, true);
}else{
navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, true, true);
navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, false, true);
}
//Update highlighted item in the navigation menu
menuItem.setChecked(true);
}
답변
이것이 고정되어 있는지 API 26 (Android 8)
또는 항상 가능 했는지 확실하지 않습니다 . 나는 여전히 안드로이드 프로그래밍의 멍청한 놈이다. 그러나 아래와 같이 부모 그룹을 추가했습니다. Android 6 실제 전화에서 테스트
- 분배기가 있습니다
nav_g1
또는 항목 중 하나를 선택하면nav_g2
다른 항목이 선택 해제됩니다.- 중첩 된 그룹으로 인해 추가 패딩이 추가되지 않았습니다.
Java
청취자에게 코드를 추가하지 않았습니다.
메뉴 코드
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<group
android:id="@+id/nav_g1"
android:checkableBehavior="single">
<item
android:id="@+id/nav_1"
android:icon="@drawable/ic_menu_share"
android:title="@string/nav_1"/>
<item
android:id="@+id/nav_2"
android:icon="@drawable/ic_menu_share"
android:title="@string/nav_2"/>
</group>
<group
android:id="@+id/nav_g2"
android:checkableBehavior="single">
<item
android:id="@+id/nav_3"
android:icon="@drawable/ic_menu_share"
android:title="@string/nav_3"/>
<item
android:id="@+id/nav_4"
android:icon="@drawable/ic_menu_share"
android:title="@string/nav_4"/>
</group>
</group>
<item android:title="Actions">
<menu>
<item
android:id="@+id/nav_7"
android:icon="@drawable/ic_menu_share"
android:title="@string/nav_7"/>
<item
android:id="@+id/nav_8"
android:icon="@drawable/ic_menu_share"
android:title="@string/nav_8"/>
</menu>
</item>
</menu>
노트
- 이 답변 에서 언급했듯이 각 그룹에는 구분선을 표시하기 위해 고유 한 ID가 있어야합니다.
- 당 이 대답 공간 구글 재료 설계 사양과 일치한다.
- 데
android:checkableBehavior="single"
에서 선택한 여러 메뉴 항목의 문제 때문에 부모 그룹은 필요 이 (hungryghost에 의해 코멘트에서 언급 한) 답변이 발생하지 않습니다
그리고 여기 스크린 샷이 있습니다