在导航抽屉中跨多个组实现多项选择
Implementing multiple selection accross multiple groups in Navigation Drawer
我想在我的 Navigation Drawer
中加入这种 selection。此图片显示了最初制作的 selection(默认情况下不是用户制作的)。
我已经通过以下代码实现了这个
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="Category">
<menu>
<group android:checkableBehavior="single">
<item
android:id="@+id/coaching"
android:icon="@drawable/coaching"
android:title="Coaching"
android:checked="true"/>
<item
android:id="@+id/training"
android:icon="@drawable/training"
android:title="Training"/>
</group>
</menu>
</item>
<group android:checkableBehavior="single">
<item
android:id="@+id/new_registrations"
android:icon="@drawable/new_registrations"
android:title="New Registrations"
android:checked="true"/>
<item
android:id="@+id/ready_certificates"
android:icon="@drawable/ready_certificates"
android:title="Certificates Ready To Collect"/>
<item
android:id="@+id/allotted_certificates"
android:icon="@drawable/allotted_certificates"
android:title="Certificates Allotted So Far"/>
</group>
但问题是,当我手动 select 任何项目时,两个组中所有先前 selected 的项目都会被删除selected。所以我想验证第一组中的一个 selection 和第二组中的一个 selection。寻找缺失的属性。
- 从两个组中删除
android:checkableBehavior="single"
。
- 从 "coaching" 和 "new_registrations" 项中删除
android:checked="true"
。
- 为每个项目单独设置
android:checkable="true"
。
- 为两个组(
"@+id/first_group"
和 "@+id/second_group"
)设置唯一 ID。
您的 activity_main_drawer.xml 应如下所示:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="Category">
<menu>
<group android:id="@+id/first_group" >
<item
android:id="@+id/coaching"
android:icon="@drawable/coaching"
android:title="Coaching"
android:checkable="true" />
<item
android:id="@+id/training"
android:icon="@drawable/training"
android:title="Training"
android:checkable="true" />
</group>
</menu>
</item>
<group android:id="@+id/second_group" >
<item
android:id="@+id/new_registrations"
android:icon="@drawable/new_registrations"
android:title="New Registrations"
android:checkable="true" />
<item
android:id="@+id/ready_certificates"
android:icon="@drawable/ready_certificates"
android:title="Certificates Ready To Collect"
android:checkable="true" />
<item
android:id="@+id/allotted_certificates"
android:icon="@drawable/allotted_certificates"
android:title="Certificates Allotted So Far"
android:checkable="true" />
</group>
</menu>
- 在 MainActivity.java 中声明两个
MenuItem
对象并检查它们。
- 将以下逻辑添加到
onNavigationItemSelected
。
您的 MainActivity.java 应如下所示:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
MenuItem prevItemOfFirstGroup;
MenuItem prevItemOfSecondGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ... some code
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
prevItemOfFirstGroup=navigationView.getMenu().findItem(R.id.coaching);
prevItemOfFirstGroup.setChecked(true);
prevItemOfSecondGroup=navigationView.getMenu().findItem(R.id.new_registrations);
prevItemOfSecondGroup.setChecked(true);
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int groupId = item.getGroupId();
if (groupId == R.id.first_group) {
if (prevItemOfFirstGroup != null) {
prevItemOfFirstGroup.setChecked(false);
}
prevItemOfFirstGroup = item;
} else if (groupId == R.id.second_group) {
if (prevItemOfSecondGroup != null) {
prevItemOfSecondGroup.setChecked(false);
}
prevItemOfSecondGroup = item;
}
item.setChecked(true);
// Handle navigation view item clicks here.
int id = item.getItemId();
// ... some code
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return false; // IMPORTANT! NOT TRUE!
}
}
我想在我的 Navigation Drawer
中加入这种 selection。此图片显示了最初制作的 selection(默认情况下不是用户制作的)。
我已经通过以下代码实现了这个
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="Category">
<menu>
<group android:checkableBehavior="single">
<item
android:id="@+id/coaching"
android:icon="@drawable/coaching"
android:title="Coaching"
android:checked="true"/>
<item
android:id="@+id/training"
android:icon="@drawable/training"
android:title="Training"/>
</group>
</menu>
</item>
<group android:checkableBehavior="single">
<item
android:id="@+id/new_registrations"
android:icon="@drawable/new_registrations"
android:title="New Registrations"
android:checked="true"/>
<item
android:id="@+id/ready_certificates"
android:icon="@drawable/ready_certificates"
android:title="Certificates Ready To Collect"/>
<item
android:id="@+id/allotted_certificates"
android:icon="@drawable/allotted_certificates"
android:title="Certificates Allotted So Far"/>
</group>
但问题是,当我手动 select 任何项目时,两个组中所有先前 selected 的项目都会被删除selected。所以我想验证第一组中的一个 selection 和第二组中的一个 selection。寻找缺失的属性。
- 从两个组中删除
android:checkableBehavior="single"
。 - 从 "coaching" 和 "new_registrations" 项中删除
android:checked="true"
。 - 为每个项目单独设置
android:checkable="true"
。 - 为两个组(
"@+id/first_group"
和"@+id/second_group"
)设置唯一 ID。
您的 activity_main_drawer.xml 应如下所示:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="Category">
<menu>
<group android:id="@+id/first_group" >
<item
android:id="@+id/coaching"
android:icon="@drawable/coaching"
android:title="Coaching"
android:checkable="true" />
<item
android:id="@+id/training"
android:icon="@drawable/training"
android:title="Training"
android:checkable="true" />
</group>
</menu>
</item>
<group android:id="@+id/second_group" >
<item
android:id="@+id/new_registrations"
android:icon="@drawable/new_registrations"
android:title="New Registrations"
android:checkable="true" />
<item
android:id="@+id/ready_certificates"
android:icon="@drawable/ready_certificates"
android:title="Certificates Ready To Collect"
android:checkable="true" />
<item
android:id="@+id/allotted_certificates"
android:icon="@drawable/allotted_certificates"
android:title="Certificates Allotted So Far"
android:checkable="true" />
</group>
</menu>
- 在 MainActivity.java 中声明两个
MenuItem
对象并检查它们。 - 将以下逻辑添加到
onNavigationItemSelected
。
您的 MainActivity.java 应如下所示:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
MenuItem prevItemOfFirstGroup;
MenuItem prevItemOfSecondGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ... some code
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
prevItemOfFirstGroup=navigationView.getMenu().findItem(R.id.coaching);
prevItemOfFirstGroup.setChecked(true);
prevItemOfSecondGroup=navigationView.getMenu().findItem(R.id.new_registrations);
prevItemOfSecondGroup.setChecked(true);
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int groupId = item.getGroupId();
if (groupId == R.id.first_group) {
if (prevItemOfFirstGroup != null) {
prevItemOfFirstGroup.setChecked(false);
}
prevItemOfFirstGroup = item;
} else if (groupId == R.id.second_group) {
if (prevItemOfSecondGroup != null) {
prevItemOfSecondGroup.setChecked(false);
}
prevItemOfSecondGroup = item;
}
item.setChecked(true);
// Handle navigation view item clicks here.
int id = item.getItemId();
// ... some code
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return false; // IMPORTANT! NOT TRUE!
}
}