【问题标题】:How to select the first item in a navigation drawer and open a fragment on application start如何选择导航抽屉中的第一项并在应用程序启动时打开片段
【发布时间】:2015-09-11 15:20:25
【问题描述】:

我用NavigationView 创建了MainActivity。当Activity 打开时,我想自动选择导航抽屉中的第一个项目并在该项目下打开Fragment。我搜索了很多,但没有找到任何合适的解决方案。

这样做的正确方法是什么?

Main Activity:

public class MainActivity extends AppCompatActivity implements Config {

private NavigationView navigationView;
private DrawerLayout drawerLayout;

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

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

    toolbar.setTitleTextColor(getResources().getColor(R.color.colorIcons));

    if (null != getSupportActionBar())
        getSupportActionBar().setLogo(R.drawable.ic_blogger_white);

    //Start PostListFragmentWebView
    /*PostListFragmentWebView postListFragmentWebView = new PostListFragmentWebView();
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.frame, postListFragmentWebView)
            .commit();*/

    //Initializing NavigationView
    navigationView = (NavigationView) findViewById(R.id.navigationView);

    //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {


            //Checking if the item is in checked state or not, if not set it to checked state.
            if (menuItem.isChecked()) menuItem.setChecked(false);
            else menuItem.setChecked(true);

            //Closing drawer on item click
            drawerLayout.closeDrawers();

            //Check to see which item was clicked and perform the appropriate action.
            switch (menuItem.getItemId()) {

                case R.id.posts:
                    PostListFragmentWebView postListFragment = new PostListFragmentWebView();
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.frame, postListFragment)
                            .commit();
                    return true;

                case R.id.pages:
                    PageListFragmentWebView pagetListFragment = new PageListFragmentWebView();
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.frame, pagetListFragment)
                            .commit();
                    return true;

                case R.id.blog:
                    BlogInfoFragmentWebView blogInfoFragment = new BlogInfoFragmentWebView();
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.frame, blogInfoFragment)
                            .commit();
                    return true;

                default:
                    Toast.makeText(getApplicationContext(), getResources().getString(R.string.drawer_error), Toast.LENGTH_SHORT).show();
                    return true;

            }

        }
    });

    // Initializing Drawer Layout and ActionBarToggle
    drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
    ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.open_drawer, R.string.close_drawer) {

        @Override
        public void onDrawerClosed(View drawerView) {
            // Code here will be triggered once the drawer closes as we don't want anything to happen so we leave this blank.
            super.onDrawerClosed(drawerView);
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank.

            super.onDrawerOpened(drawerView);
        }
    };

    //Setting the actionbarToggle to drawer layout
    drawerLayout.setDrawerListener(actionBarDrawerToggle);
    drawerLayout.getChildAt(0).setSelected(true);

    //calling sync state is necessary or else your hamburger icon wont show up
    actionBarDrawerToggle.syncState();
}
}

【问题讨论】:

标签: android android-fragments navigation-drawer


【解决方案1】:

onCreate() 中,以下代码将在首次启动时加载第一项的片段:

if (savedInstanceState == null) {
    navigationView.getMenu().performIdentifierAction(R.id.posts, 0);
}

感谢calvinfly for this comment

【讨论】:

  • 你把这段代码放在哪里以确保它只在启动时运行,而不是在每次创建活动时运行?
  • 另外,这会选择第一项,但不会在菜单中将其标记为选中。 ://
  • 我已将其放入 onCreate,用于项目检查 if (menuItem.isChecked()) menuItem.setChecked(false); else menuItem.setChecked(true); 为我工作。顺便说一句,我不再使用它,而是现在使用 THIS
【解决方案2】:

android:checked="true" 添加到您的第一个菜单项。

并手动选择一项,使用

getSupportFragmentManager().beginTransaction().replace(R.id.frame, postListFragment).commit();

打开片段。

【讨论】:

  • 它已经添加,但是当活动开始时它显示空白页面,即活动内容视图我想用片段替换它,我知道我可以直接用 FragmentTransaction 执行此操作,但我想选择抽屉中的第一个导航项以编程方式!
  • 添加android:checked="true" 只是让菜单处于选中状态。并查看我对打开片段的修订答案。
【解决方案3】:

而不是普通的监听器...

navView.setNavigationItemSelected(new Navigation.View.OnNavigationItemSelectedListener() {bla, bla, bla})

将侦听器创建为 Obj:

NavigationView.OnNavigationItemSelectedListener navViewListener;
            navView.setNavigationItemSelectedListener(navViewListener = new NavigationView.OnNavigationItemSelectedListener() {bla, bla, bla})

...并使用Obj触发监听事件:

navViewListener.onNavigationItemSelected(navView.getMenu().getItem(0));

...其中 getItem(0) 是第一个菜单项。

在其菜单项 XML 定义中使用方法 getItem(0).setChecked(true) 或 android:checked="true"。

【讨论】:

  • 完美解决方案!
【解决方案4】:

您也可以在设置导航视图后使用navigationView.setCheckedItem(R.id.default)(javadoc)。

【讨论】:

    【解决方案5】:

    只需在onCreate 方法中添加此代码:

    FragmentTransaction ftrans = getFragmentManager().beginTransaction();
    ftrans.replace(R.id.container, <yourfragment>).commit();
    

    为我工作!

    【讨论】:

      【解决方案6】:

      在考虑方向和其他配置更改时,这可以做得更好。我们可以根据我们是否来自先前的状态来选择任何导航抽屉菜单项。检查:对于使用 Activity 的导航抽屉:-

      public static final String SELECTED_NAV_MENU_KEY = "selected_nav_menu_key";
      // The selected grid position
      private int mSelectedNavMenuIndex = 0;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_demo);
      
         ...........................................................
      
          navigationView.setNavigationItemSelectedListener(this);
      
          if (savedInstanceState != null) {
              // Recover assets
              mSelectedNavMenuIndex = savedInstanceState.getInt(SELECTED_NAV_MENU_KEY);
      
              // Recover menu as selected
              MenuItem menuItem = navigationView.getMenu().getItem(mSelectedNavMenuIndex);
              toggleNavMenuItemCheck(menuItem);
              navigationView.getMenu().performIdentifierAction(menuItem.getItemId(), mSelectedNavMenuIndex);
              return;
          } else {
              MenuItem menuItem = navigationView.getMenu().getItem(mSelectedNavMenuIndex);
              toggleNavMenuItemCheck(menuItem);
              navigationView.getMenu().performIdentifierAction(menuItem.getItemId(), mSelectedNavMenuIndex);
          }
      }
      

      帮助取消选中或选中菜单项的切换方法

      private void toggleNavMenuItemCheck(MenuItem menuItem) {
          if (menuItem.isChecked()){
              menuItem.setChecked(false);
          }  else {
              menuItem.setChecked(true);
          }
      }
      

      这就是我保存所选菜单项状态的方式。检查:-

      @Override
          public boolean onNavigationItemSelected(MenuItem item) {
              int id = item.getItemId();
      
              switch (id) {
                  case R.id.nav_explore:
                      showExploreFragment(null);
                      mSelectedNavMenuIndex = 0;
                      break;
                  case R.id.nav_orders:
                      mSelectedNavMenuIndex = 1;
                      break;
                  case R.id.nav_settings:
                      mSelectedNavMenuIndex = 2;
                      break;
                  default:
                      showExploreFragment(null);
                      mSelectedNavMenuIndex = 0;
              }
              drawer.closeDrawer(GravityCompat.START);
              return true;
          }
      
      // Save any important data for recovery
          @Override
          protected void onSaveInstanceState(Bundle outState) {
              super.onSaveInstanceState(outState);
              outState.putInt(SELECTED_NAV_MENU_KEY, mSelectedNavMenuIndex);
          }
      

      注意:代码行:

      navigationView.getMenu().performIdentifierAction(menuItem.getItemId(), mSelectedNavMenuIndex);
      

      可替换为代码:

      onNavigationItemSelected(menuItem);
      

      【讨论】:

        【解决方案7】:

        menu.xml 中记得提及android:checkable="true" 表示单个项目,android:checkableBehavior="single" 表示一组项目。

        <item
                android:id="@+id/pos_item_help"
                android:checkable="true"
                android:title="Help" />
        
            <group
                android:id="@+id/group"
                android:checkableBehavior="single">
                <item
                    android:id="@+id/menu_nav_home"
                    android:icon="@drawable/ic_home_black_24dp"
                    android:title="@string/menu_nav_home" />
            </group>
        

        然后在NavigationItemSelectedListener 中使用setCheckedItem(R.id.item_id_in_menu) 使其被选中。

        @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
        
                    case R.id.pos_item_pos:
                        navigationView.setCheckedItem(R.id.pos_item_pos);
                        break;
                    case R.id.pos_item_orders:
                        navigationView.setCheckedItem(R.id.pos_item_orders);
                        break;
                    default:
                }
                return true;
            }
        

        而且您不必再执行管理所选项目的繁琐任务。 navigationView 自己管理。

        【讨论】:

          【解决方案8】:

          1.) 要首先登陆 HomeFragment,请在 MainActivity 的 onCreate() 中使用它:

          Fragment fragment = new HomeFragment();
          // replacing the fragment
          if (fragment != null) {
              FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
              ft.replace(R.id.content_frame, fragment);
              ft.commit();
          }
          

          2.) 要将项目设置为在 navigationDrawer 中选中,请将项目设置为在 navigation_menu.xml 中选中

           android:checked = "true"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-06-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-30
            • 1970-01-01
            • 2013-12-16
            相关资源
            最近更新 更多