web-dev-qa-db-fra.com

Tiroir de navigation: Comment définir l’élément sélectionné au démarrage?

Mon code fonctionne parfaitement: chaque fois qu'un élément est cliqué dans le tiroir de navigation, il est sélectionné.

Bien sûr, je veux démarrer l'application avec un fragment par défaut (maison), mais l'élément de sélection n'a pas été sélectionné dans le tiroir de navigation. Comment puis-je sélectionner cet élément par programme?

public class BaseApp extends AppCompatActivity {

    //Defining Variables
    protected String LOGTAG = "LOGDEBUG";
    protected Toolbar toolbar;
    protected NavigationView navigationView;
    protected DrawerLayout drawerLayout;

    private DateManager db = null;

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

        navigationView = (NavigationView) findViewById(R.id.navigation_view);


        // set the home/dashboard at startup

        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.frame, new DashboardFragment());
        fragmentTransaction.commit();

        setNavDrawer();
    }

    private void setNavDrawer(){

        // Initializing Toolbar and setting it as the actionbar
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //Initializing NavigationView

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

            // This method will trigger on item Click of navigation menu
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {


                //Checking if the item is in checked state or not, if not make it in checked state

                // I THINK THAT I NEED EDIT HERE...

                if (menuItem.isChecked()) menuItem.setChecked(false);
                else menuItem.setChecked(true);

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


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

                    //Replacing the main content with ContentFragment 

                    case R.id.home:

                        DashboardFragment dashboardFragment = new DashboardFragment();
                        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.frame, dashboardFragment,"DASHBOARD_FRAGMENT");
                        fragmentTransaction.commit();
                        return true;
[...]

Je pense que je dois éditer ici:

if (menuItem.isChecked()) menuItem.setChecked(false);
                    else menuItem.setChecked(true);

Ou dans onCreate au démarrage de l'application avec FragmentTransaction.

Merci pour votre soutien.

195
sineverba

Vous pouvez aussi appeler:

navigationView.setCheckedItem(id);

Cette méthode a été introduite dans l'API 23.0.0

Exemple

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:tools="http://schemas.Android.com/tools"
      tools:ignore="UnusedIds">

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

Note: Android:checkableBehavior="single"

Voir aussi this

95
kingston

Exemple ( NavigationView.OnNavigationItemSelectedListener ):

private void setFirstItemNavigationView() {
        navigationView.setCheckedItem(R.id.custom_id);
        navigationView.getMenu().performIdentifierAction(R.id.custom_id, 0);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setFirstItemNavigationView();
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    FragmentManager fragmentManager = getFragmentManager();

    switch (item.getItemId()) {
        case R.id.custom_id:
            Fragment frag = new CustomFragment();

            // update the main content by replacing fragments
            fragmentManager.beginTransaction()
                    .replace(R.id.viewholder_container, frag)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .addToBackStack(null)
                    .commit();
            break;
    }

Tks

28
GFPF

Il y a toujours des problèmes avec Googles "oh so great" support libs. Si vous souhaitez vérifier un élément sans rétrograder la version de votre bibliothèque de support, définissez simplement checkable avant de définir l'état vérifié 

MenuItem item = drawer.getMenu().findItem(R.id.action_something);
item.setCheckable(true);
item.setChecked(true);

Cela pourrait également fonctionner si vous définissez checkable dans le menu xml files

24
Daniel B

Vous pouvez à la fois mettre en surbrillance et sélectionner l’élément avec le 1-liner suivant:

navigationView.getMenu().performIdentifierAction(R.id.posts, 0);

Source: https://stackoverflow.com/a/31044917/383761

11
Hugh Jeffner

Vous devez appeler 2 fonctions pour cela:

Premièrement: pour activer les commandes que vous avez implémentées dans onNavigationItemSelected auditeur:

onNavigationItemSelected(navigationView.getMenu().getItem(R.id.nav_camera));

Seconde: pour changer l'état de l'élément de menu du tiroir de navigation en sélectionné (ou coché):

navigationView.setCheckedItem(R.id.nav_camera);

J'ai appelé les deux fonctions et cela a fonctionné pour moi.

6
MBH

Ceci est ma solution, très simple.

Voici mon fichier menu.xml:

<group
    Android:id="@+id/grp1"
    Android:checkableBehavior="single">
    <item
        Android:id="@+id/nav_all_deals"
        Android:checked="true"
        Android:icon="@drawable/ic_all_deals"
        Android:title="@string/all_deals" />
    <item
        Android:id="@+id/nav_news_and_events"
        Android:icon="@drawable/ic_news"
        Android:title="@string/news_and_events" />
    <item
        Android:id="@+id/nav_histories"
        Android:icon="@drawable/ic_histories"
        Android:title="@string/histories" />
</group>

Le menu ci-dessus met en évidence le premier élément du menu. Au-dessous de la ligne fera quelque chose (par exemple: montrer le premier fragment, etc.). NOTE: écrivez après 'configurez votre code de tiroir'

onNavigationItemSelected(mNavigationView.getMenu().getItem(0));
3
Na Pro

Tout d'abord créer des couleurs pour l'élément sélectionné. Ici https://stackoverflow.com/a/30594875/1462969 bon exemple. Cela vous aide à changer la couleur de l'icône. Pour changer l’arrière-plan de tous les éléments sélectionnés, ajoutez dans votre fichier values ​​\ style.xml ce 

  <item name="selectableItemBackground">@drawable/selectable_item_background</item>

Où selectable_item_background doit être déclaré dans drawable/selectable_item_background.xml 

  <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/accent_translucent"
      Android:state_pressed="true" />
    <item Android:drawable="@Android:color/transparent" />
   </selector>

Où la couleur peut être déclarée dans style.xml

 <color name="accent_translucent">#80FFEB3B</color>

Et après ça 

   // The main navigation menu with user-specific actions
        mainNavigationMenu_ = (NavigationView) findViewById(R.id.main_drawer);
        mainNavigationMenu_.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                mainNavigationMenu_.getMenu().findItem(itemId).setChecked(true);
                return true;
            }
        });

Comme vous le voyez, j'ai utilisé ceci mainNavigationMenu_.getMenu (). FindItem (itemId) .setChecked (true); pour définir l'élément sélectionné . Ici navigationView

 <Android.support.design.widget.NavigationView
        Android:id="@+id/main_drawer"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        app:headerLayout="@layout/header_main_navigation_menu"
        app:itemIconTint="@color/state_list"
        app:itemTextColor="@color/primary"
        app:menu="@menu/main_menu_drawer"/>
2
Waran-

Le moyen le plus simple est de le sélectionner à partir de XML comme suit,

<menu>
   <group Android:checkableBehavior="single">
         <item
              Android:checked="true"
              Android:id="@+id/nav_home"
              Android:icon="@drawable/nav_home"
              Android:title="@string/main_screen_title_home" />

Notez la ligne Android:checked="true"

1

sur votre activité (derrière le tiroir):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar,
               R.string.navigation_drawer_open,
               R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    navigationView.setCheckedItem(R.id.nav_portfolio);
    onNavigationItemSelected(navigationView.getMenu().getItem(0));
}

et

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    Fragment fragment = null;

    if (id == R.id.nav_test1) {
        fragment = new Test1Fragment();
        displaySelectedFragment(fragment);
    } else if (id == R.id.nav_test2) {
        fragment = new Test2Fragment();
        displaySelectedFragment(fragment);
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

et dans votre menu:

<group Android:checkableBehavior="single">

    <item
        Android:id="@+id/nav_test1"
        Android:title="@string/test1" />

    <item
        Android:id="@+id/nav_test2"
        Android:title="@string/test2" />

  </group>

donc le premier menu est mettez en surbrillance et show comme menu par défaut.

0
M.Namjo

Faire un sélecteur pour chaque article de Nav Drawer

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/darkBlue" Android:state_pressed="true"/>
    <item Android:drawable="@color/darkBlue" Android:state_checked="true"/>
    <item Android:drawable="@color/textBlue" />
</selector>

Apporter quelques modifications dans votre NavigationView

<Android.support.design.widget.NavigationView
        Android:id="@+id/nav_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:fitsSystemWindows="true"
        app:itemBackground="@drawable/drawer_item"
        Android:background="@color/textBlue"
        app:itemIconTint="@color/white"
        app:itemTextColor="@color/white"
        app:menu="@menu/activity_main_drawer"
        />
0
Ritesh

Le code ci-dessous est utilisé pour sélectionner le premier élément et mettre en évidence le premier élément sélectionné dans le menu.

onNavigationItemSelected (mNavigationView.getMenu (). getItem (0) .setChecked (true));

0
Bhavana hegde

Lorsque vous utilisez BottomNavigationViewname__, les autres réponses telles que navigationView.getMenu().getItem(0).setChecked(true); et navigationView.setCheckedItem(id); ne fonctionneront pas en appelant setSelectedItemIdNAME _ fonctionne:

    BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation_view);

    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            // TODO: 10-Aug-19 your code here 
        }
    });

    bottomNavigationView.setSelectedItemId(R.id.myitem);
0
Roshna Omer