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.
navigationView.setCheckedItem(id);
Cette méthode a été introduite dans l'API 23.0.0
<?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
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
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
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);
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.
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));
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"/>
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"
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.
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"
/>
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));
Lorsque vous utilisez BottomNavigationView
name__, les autres réponses telles que navigationView.getMenu().getItem(0).setChecked(true);
et navigationView.setCheckedItem(id);
ne fonctionneront pas en appelant setSelectedItemId
NAME _ 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);