web-dev-qa-db-fra.com

Couleur de fond de l'élément du tiroir de navigation pour l'élément sélectionné

J'ai utilisé Android Studio pour implémenter le tiroir de navigation et je ne parviens pas à obtenir la couleur bleue utilisée pour indiquer quelle section nous sommes en train de modifier.

J'ai essayé de nombreuses choses, j'utilise actuellement un listSelector qui ressemble à:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item Android:state_activated="true" Android:drawable="@color/selected" />
    <item Android:state_pressed="true" Android:drawable="@color/highlight" />


</selector>

J'ai aussi essayé state_checked. state_pressed fonctionne dans cette situation, mais l'élément sélectionné est toujours bleu. 

EDIT: J'examine cela de plus en plus et lorsque l'adaptateur est créé, le contexte transmis est getActionBar().getThemedContext(). Je me demande donc si je peux trouver le bon attribut à affecter à mon style de barre d'actions, je peux le changer à partir de là. J'ai essayé quelques attributs différents sans succès. Est-ce que quelqu'un connaît l'attribut exact?

J'ai aussi réalisé que si je mettais

<item name="Android:activatedBackgroundIndicator">@drawable/nav_listview_selector</item>

dans la partie principale de mon thème et changez getActionBar().getThemedContext() pour getActivity.getBaseContext, je pourrai alors changer la couleur, mais je ne pense pas que ce soit la bonne façon. Je pense que le contexte thématique devrait être utilisé. Donc, si quelqu'un sait où la activatedBackgroundIndicator peut être placée pour qu'elle soit utilisée dans getActionBar.getThemedContext()

EDIT2:

La vue de texte utilisée pour la liste est donc celle du SDK:

<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@Android:id/text1"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:textAppearance="?android:attr/textAppearanceListItemSmall"
    Android:gravity="center_vertical"
    Android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    Android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    Android:background="?android:attr/activatedBackgroundIndicator"
    Android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>

J'ai donc essayé de modifier le "?android:attr/activatedBackgroundIndicator" au niveau du thème mais cela n'a pas d'effet pour coché/sélectionné/activé mais c'est le cas pour appuyé. Quelqu'un sait pourquoi c'est comme cela? Et comment je peux le changer?

40
RyanJohnstone

Vous ne savez toujours pas pourquoi cela ne fonctionne pas. Mais la solution que j’ai trouvée est d’utiliser ma propre disposition simple_list_item_activated à transmettre à ArrayAdapter, qui était pratiquement la même, à l’exception de la couleur blanche du texte. J'ai ensuite remplacé getActionBar().getThemedContext() par getActivity().getBaseContext() et cela a maintenant un effet.

Ce n'est peut-être pas la bonne façon et peut avoir des répercussions à l'avenir, mais pour l'instant, tout fonctionne comme je le souhaite.

0
RyanJohnstone

Pour résoudre ce problème:

1- Vous n'avez pas besoin d'Android: listSelector sous votre ListView.

2- Ouvrez (ou créez) styles.xml sous (res/values).

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="Android:activatedBackgroundIndicator">@drawable/drawer_list_selector</item>
</style>

3- Dans le dossier res/drawable, créez le fichier tiroir_list_selector.xml

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_pressed="true" Android:drawable="@drawable/light_gray_color" />
    <item Android:state_activated="true" Android:drawable="@drawable/red_color" />
    <item Android:drawable="@Android:color/transparent" />
</selector>

4- Sous res/drawable, créez red_color.xml/light_gray_color.xml (ou tout autre nom) et ajoutez la couleur Hex souhaitée:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <solid Android:color="#C8FF0000"/>
</shape>

5- Ouvrez votre projet AndroidManifest.xml et ajoutez Android: balise de thème (si elle n'existe pas) 

<application
    Android:allowBackup="true"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >

Référence/Crédit: Modification de la couleur par défaut de la couleur d'élément sélectionné dans le tiroir de navigation

51
Ashraf Alshahawy

voici comment j’ai fait et cela fonctionne, le bref concept maintient la position de l’élément sélectionné dans adaptateur et appelle notifyDataSetChanged à l’appel notifyDatasetChanged la méthode getView est appelée à nouveau voir vérifier la position sur la position sélectionnée changer la vue de fond. Voici le code:

Adaptateur de la liste de navigationDrawer

public class MenuAdapter extends BaseAdapter {

private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private Context mContext;
private String name;
private int profile;
private int mIcons[];
private int selectedPosition = 0;
private String mNavTitles[];
private LayoutInflater mInflater;

public MenuAdapter(String titles[], int icon[], String Name, int profile) {
    mNavTitles = titles;
    mIcons = icon;
    name = Name;
    this.profile = profile;
}

public MenuAdapter(String Titles[], int Icons[], Context mContext) {
    mNavTitles = Titles;
    mIcons = Icons;
    this.mContext = mContext;
    mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return mNavTitles.length;
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    convertView = mInflater.inflate(R.layout.item_row, parent, false);

    TextView textView = (TextView) convertView.findViewById(R.id.rowText);
    ImageView imageView = (ImageView) convertView.findViewById(R.id.rowIcon);
    final LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.outerLayout);

    imageView.setImageResource(mIcons[position]);
    textView.setText(mNavTitles[position]);

    if (position == selectedPosition)
        layout.setBackgroundColor(mContext.getResources().getColor(R.color.app_bg));
    else  
      layout.setBackgroundColor(mContext.getResources().getColor(R.color.normal_bg));

    return convertView;
}

public void setSelectedPosition(int position) {

    this.selectedPosition = position;

}


}

dans ton activité fais ça 

 private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) { 
        mMenuAdapter.setSelectedPosition(position - 1);
        mMenuAdapter.notifyDataSetChanged();
    }
}

si quelqu'un rencontre encore des difficultés, n'hésitez pas à demander.

6
Syed Raza Mehdi

J'ai implémenter le menu du tiroir avec la classe d'adaptateur personnalisé. Peut-être que cela aidera quelqu'un Liste des tiroirs

<ListView
    Android:id="@+id/listview_drawer"
    Android:layout_width="260dp"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:background="@color/menu_item_color"
    Android:choiceMode="singleChoice"
    Android:divider="@Android:color/transparent"
    Android:dividerHeight="0dp"
    Android:fadingEdge="none"
    />

tiroir_list_item.xml

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" 
Android:background="@drawable/menu_selector"
>

<ImageView
    Android:id="@+id/imgIcon"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerVertical="true"
    Android:layout_marginLeft="12dp"
    Android:layout_marginRight="12dp"
    Android:src="@drawable/ic_menu_home" />

<TextView
    Android:id="@+id/lblName"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_centerVertical="true"
    Android:gravity="center_vertical"
    Android:layout_toRightOf="@+id/imgIcon"
    Android:minHeight="48dp"
    Android:textColor="@color/menu_txt_color" />

menu_selector.xml

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:exitFadeDuration="@Android:integer/config_mediumAnimTime">
<!-- selected -->
<item Android:drawable="@color/menu_item_active_color" Android:state_focused="true" Android:state_pressed="false"/>
<item Android:drawable="@color/menu_item_active_color" Android:state_pressed="true"/>
<item Android:drawable="@color/menu_item_active_color" Android:state_activated="true"/>
<item Android:drawable="@color/menu_item_active_color" Android:state_checked="true"/>
<item Android:drawable="@color/menu_item_active_color" Android:state_selected="true"/>

<item Android:drawable="@color/menu_item_color" Android:state_activated="false"/>

Ajoutez ceci sur l'élément, cliquez sur le listner de listview yourlistview.setItemChecked (position, true);

5
Bhavin Chauhan

Pour changer la couleur d'arrière-plan de l'élément " Tiroir de navigation pour l'élément sélectionné ", vous pouvez le faire avec l'attribut suivant: 

colorControlHighlight

Dans votre " styles.xml " cela pourrait ressembler à ceci:

<style name="YourStyleNameFor.NavigationDrawer" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorControlHighlight">@color/your_highlight_color</item>
</style>

N'oubliez pas d'appliquer votre Style dans le tag :

Android.support.design.widget.NavigationView

Par exemple, dans votre activity_main.xml , cela pourrait ressembler à ceci:

<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:headerLayout="@layout/navigationdrawer_header"

    <!-- the following line referes to your style  -->
    app:theme="@style/YourThemeNameFor.NavigationDrawer"

    <!-- the following two lines are maybe also interesting for you -->
    app:itemIconTint="@color/gray3"
    app:itemTextColor="@color/gray3"

    app:menu="@menu/navigationdrawer_main" />
5
user3570407

Cela fonctionne pour moi:

  1. Définissez d'abord un item_bg.xml pouvant être dessiné comme suit:

    <?xml version="1.0" encoding="utf-8"?>
        <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
            <item Android:state_checked="true" Android:drawable="@drawable/nav_menu_bg" />
        </selector>
    
  2. Ensuite, utilisez ce dessin dans navigation_main_layout.xml comme:

    <Android.support.design.widget.NavigationView
        Android:id="@+id/nav_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        app:itemBackground="@drawable/item_bg"
        Android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_navigation"
        app:menu="@menu/navigation_main_layout_drawer" />
    
4
Mithun Biswas
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
   <item Android:drawable="@color/list_item_back_pressed" Android:state_pressed="true" />
    <item  Android:state_activated="true"><color Android:color="@color/primary_blue"/></item>
   <item Android:drawable="@color/list_item_back_normal"/>

</selector>
2
Query

Cela a fonctionné pour moi: Implémenté tiroir de menu non pas en remplissant la vue de navigation avec liste, mais avec des éléments de menu.

créé un drawable comme ceci: 

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

et dans la méthode onCreate, définissez l'identifiant de l'élément de menu qui correspond à l'activité sélectionnée, tel que coché. et implémentez le fichier de sélection pouvant être dessiné dans votre tiroir de navigation comme ceci 

    app:itemBackground="@drawable/drawer_menu_selector"

fyi: besoin de définir votre espace de noms 'app'.

0
antroid

Je sais que c'est trop tard, mais j'ai résolu ce problème dans mon application.

Pls ne pense pas que c'est idiot, simplement changer la position de "state_pressed" en haut.

<item Android:drawable="@drawable/list_item_bg_pressed" Android:state_pressed="true"/>
<item Android:drawable="@drawable/list_item_bg_normal" Android:state_activated="false"/>
<item Android:drawable="@drawable/list_item_bg_selected" Android:state_activated="true"/>
0

En plus de fournir un sélecteur personnalisé pouvant être dessiné pour le listSelector, vous devez également définir la ressource d’arrière-plan de l’élément de la liste sur un sélecteur similaire qui peut être dessiné de différentes façons pour les différents états.

0
stan0

J'utilise généralement mon adaptateur personnalisé qui a un champ de sélection int et une fonction setSelection (int). Et dans la fonction getView, je règle l'arrière-plan de la vue en fonction de la position == sélection.

0
Ripityom

Dans l’avenir, si quelqu'un vient ici en utilisant l'activité de navigation dans le tiroir (fournie par Studio dans la fenêtre d'activité)

La réponse est -

Utilisez ceci avant OnCreate () dans MainActivity

    int[][] state = new int[][] {
            new int[] {Android.R.attr.state_checked}, // checked
            new int[] {-Android.R.attr.state_checked}
    };

    int[] color = new int[] {
            Color.rgb(255,46,84),
            (Color.BLACK)
    };

    ColorStateList csl = new ColorStateList(state, color);

    int[][] state2 = new int[][] {
            new int[] {Android.R.attr.state_checked}, // checked
            new int[] {-Android.R.attr.state_checked}
    };

    int[] color2 = new int[] {
            Color.rgb(255,46,84),
            (Color.GRAY)
    };

ColorStateList csl2 = new ColorStateList(state2, color2);

et l'utiliser dans onNavigationItemSelected () dans MainActivity (vous n'avez pas besoin d'écrire cette fonction si vous utilisez l'activité du tiroir de navigation, elle sera ajoutée dans MainActivity).

 NavigationView nav = (NavigationView) findViewById(R.id.nav_view);
    nav.setItemTextColor(csl);
    nav.setItemIconTintList(csl2);
    nav.setItemBackgroundResource(R.color.white);

Astuce - ajoutez ce code avant If else Condition dans onNavigationItemSelected ()

0
Chirag Joshi