Android 导航视图-按“后退”按钮时选中更新项目

Android 导航视图-按“后退”按钮时选中更新项目,android,Android,我在MainActivity(AppCompatActivity)上创建了导航视图。 我在导航视图上有多个项目,每个项目都是一个片段 当我使用后退按钮时,我想转到上一个片段,而不是将我的应用程序放在后台。因此,要在我使用的片段之间进行更改: FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.layo

我在MainActivity(AppCompatActivity)上创建了导航视图。 我在导航视图上有多个项目,每个项目都是一个片段

当我使用后退按钮时,我想转到上一个片段,而不是将我的应用程序放在后台。因此,要在我使用的片段之间进行更改:

       FragmentManager fragmentManager = getSupportFragmentManager();
       fragmentManager.beginTransaction().replace(R.id.layout, fragment).addToBackStack(null).commit();

当我按下back按钮时,它会转到上一个片段,但NavigationView中选中的项目仍然保留。按下“后退”按钮时更新NavigationView中选中项的最佳方法是什么?

我在我的项目中使用了以下代码……而且它起了作用。。。。 我已将菜单项充气到导航抽屉中。。。。。 您必须在每个片段中实现它…在onActivityCreated()方法中…因为此方法肯定会在创建活动后调用,所以我们可以使用UI元素

//代码

NavigationView navigation = (NavigationView)getActivity().findViewById(R.id.navigation_view);
Menu drawer_menu = navigation.getMenu();
MenuItem menuItem;
menuItem = drawer_menu.findItem(R.id.Id_ofYourMenuItem);
    if(!menuItem.isChecked())
    {
        menuItem.setChecked(true);
    }

因此,每次调用您的片段时(通过导航抽屉或按下后退按钮),它都会将菜单项设置为选中状态。

对于未来的用户,这里有另一个解决方案:

my drawer_menu.xml类似于:

    <item
                android:id="@+id/Home"
                android:title="Home"
                android:icon="@drawable/ic_account_balance_black_24dp"
                >

            </item>
<item
            android:id="@+id/courses"
            android:title="courses"
            android:icon="@drawable/ic_airplay_black_24dp"
            >

        </item>
        <item
            android:id="@+id/download"
            android:title="Download"
            android:icon="@drawable/ic_file_download_black_24dp"
            >

        </item>
现在在mainactivity中创建一个手动方法,以便在片段恢复时从片段调用此方法:

 public void SetNavItemChecked(int id)
    {
        Menu m=navigationView.getMenu();
        MenuItem mi=m.getItem(id);
        mi.setChecked(true);
    }
现在,在这个示例的所有片段中,Homefragment、CoursesFragment、DownloadFragment就是片段

在HomeFragment(YourFragment)中:

重写onresume方法:

    @Override
        public void onResume() {
            super.onResume();

            ((MainActivity)getActivity()).SetNavItemChecked(0);
            // MainActivity is your activity 
            //SetNavItemChecked is method from activity and 0 is first item in menu for this example o is HomeFragment
 }

对于所有剩余的片段,您可以像上面那样在resume方法中写入,或者,您可以创建一个堆栈,当选择NavigationDrawer的MenuItems时,该堆栈存储这些MenuItems,然后使用onBackButtonPressed方法中的poll方法获取并取消选中MenuItem,并使用peek方法设置Checked(true)当前菜单项


可能不是最有效的方法,但很容易实现。

在处理堆栈时,您必须控制
on backpressed
中项目的选中和取消选中。这当然适用于单击导航抽屉中的菜单项。但实际上,您应该在“OnOptions ItemSelected”内调用menuItem.setChecked(true)。当按下“后退”按钮时,您的方法也不起作用,因为按下“后退”按钮时,会从缓存中提取视图,而不会重新绘制。@edwoollard,我已经发布了我在应用程序中使用的工作代码……它正在按“后退”按钮。它必须起作用,因为碎片会重新绘制。我更多的是指活动,因为这对他们不起作用,因为他们坐在后台。
    @Override
        public void onResume() {
            super.onResume();

            ((MainActivity)getActivity()).SetNavItemChecked(0);
            // MainActivity is your activity 
            //SetNavItemChecked is method from activity and 0 is first item in menu for this example o is HomeFragment
 }