web-dev-qa-db-fra.com

Comment sélectionner le premier élément dans un tiroir de navigation et ouvrir un fragment au démarrage de l'application

J'ai créé MainActivity avec NavigationView. Lorsque Activity est ouvert, je souhaite sélectionner automatiquement le premier élément du tiroir de navigation et ouvrir Fragment sous cet élément. J'ai beaucoup cherché mais je n'ai trouvé aucune solution appropriée.

Quelle est la bonne façon de faire cela?

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();
}
}
14
DCK

Dans onCreate(), le code suivant chargera le fragment du premier élément au premier démarrage:

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

Merci à calvinfly pour ce commentaire .

40
DCK

Ajoutez Android:checked="true" à votre premier élément de menu.

Et sélectionnez manuellement un élément, en utilisant 

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

ouvrir un fragment.

14
Ellie Zou

Au lieu d'un auditeur normal ... 

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

Créez l'auditeur en tant qu'obj:

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

... et utilisez Obj pour déclencher l'événement d'écoute:

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

... où getItem (0) est le premier élément de menu.

Utilisez une méthode getItem (0) .setChecked (true) ou Android: checked = "true" dans sa définition XML d'élément de menu. 

3
Marcus Martinho

Vous pouvez également utiliser navigationView.setCheckedItem(R.id.default) ( javadoc ) après avoir configuré votre navigationview.

1
KuroObi

Cela peut être encore mieux réalisé en tenant compte de l'orientation et des autres changements de configuration. Nous pourrions choisir le menu de tous les tiroirs nav selon que nous venons d’un état antérieur Contrôle: Pour le tiroir de navigation portant l’activité: -

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);
    }
}

La méthode de basculement qui aide à décocher ou à cocher l'élément de menu

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

Voici comment enregistrer l'état de l'élément de menu sélectionné. Vérifier:-

@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);
    }

NB: La ligne avec le code:

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

Peut être remplacé par le code:

onNavigationItemSelected(menuItem);
0
Rowland Mtetezi

1.) Pour atterrir initialement sur HomeFragment, utilisez ceci dans votre onCreate () dans MainActivity:

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

2.) Pour définir l'élément comme sélectionné dans navigationDrawer, définissez-le comme vérifié dans navigation_menu.xml 

 Android:checked = "true"
0
Saurabh Singh

dans menu.xml, n'oubliez pas de mentionner Android:checkable="true" pour un article et Android:checkableBehavior="single" pour un groupe d'articles.

<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>

puis dans NavigationItemSelectedListener, utilisez setCheckedItem(R.id.item_id_in_menu) pour le sélectionner.

@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;
    }

Et vous n'avez plus à faire la sale tâche de gérer l'élément sélectionné. navigationView le gère lui-même.

0
sud007

ajoutez simplement ce code dans la méthode onCreate:

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

Travaille pour moi ! 

0
O6e36ashenII