Couleur de fond de L'élément de tiroir de Navigation pour l'élément sélectionné

J'ai utilisé Android Studio pour implémenter le tiroir de Navigation et je ne peux pas obtenir la couleur bleue utilisée pour montrer la section dans laquelle nous sommes actuellement à changer.

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 œuvres dans cette situation, mais l'élément actuellement sélectionné est toujours bleu.

Modifier: J'ai examiné cela plus et lorsque l'adaptateur est créé, le contexte qui est passé est getActionBar().getThemedContext() donc Je pense que si je peux trouver le bon attribut à attribuer à mon style actionbar, je peux le changer à partir de là. J'ai essayé quelques attributs différents sans succès. Personne ne sait exactement attribut?

J'ai aussi réalisé si je mets

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

Dans la partie principale de mon thème et changer getActionBar().getThemedContext() pour getActivity.getBaseContext Alors je peux 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ù le activatedBackgroundIndicator pourrait être mis de sorte qu'il serait utilisé dans getActionBar.getThemedContext()

EDIT2:

Donc, la vue texte utilisée pour la listview est une dans le SDK, elle ressemble à ceci:

<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 il n'a aucun effet pour checked / selected / activated mais il le fait pour pressed. Est-ce que quelqu'un sait pourquoi c'est? Et comment je peux le changer?

36
demandé sur RyanJohnstone 2014-03-13 13:48:16

12 réponses

Pour résoudre ce problème:

1 - vous n'avez pas besoin d'android: listSelector sous votre ListView.

2-Ouvrir (ou créer) 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-sous dossier res/drawable créer drawer_list_selector.xml fichier

<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éer red_color.xml / light_gray_color.xml (ou tout autre nom) et ajoutez la couleur hexadécimale 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 ajouter android: theme tag (s'il 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 du tiroir de Navigation couleur de l'élément sélectionné à partir du bleu par défaut

49
répondu Ashraf Alshahawy 2017-05-23 12:18:07

Voici comment j'ai fait et cela fonctionne, le bref concept {[7] } est de maintenir la position de l'élément sélectionné dans adaptateur et appeler notifyDataSetChanged en appelant notifyDatasetChanged la méthode getView est appelée à nouveau et dans get view vérifier la position sur la position sélectionnée changer la vue d'arrière-plan. Voici le code :

Adaptateur de la vue de liste 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 votre activité faites ceci

 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
répondu Syed Raza Mehdi 2015-09-16 12:33:51

J'ai implémenter un menu de tiroir avec une classe d'adaptateur personnalisée. Peut-être que cela aidera quelqu'un Liste de 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"
    />

Drawer_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 listner de listview yourlistview.setItemChecked(position, vrai);

5
répondu Bhavin Chauhan 2014-11-13 05:22:49

Pour changer la couleur d'arrière-plan "de L'élément de tiroir de Navigation pour l'élément sélectionné", Vous pouvez le faire avec l'attribut:

ColorControlHighlight

Dans vos 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 de présenter votre Style dans le balise:

Android.soutien.conception.widget.La fenêtre des éléments

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
répondu user3570407 2016-10-09 19:11:26

Cela fonctionne pour moi:

  1. Définissez D'abord un drawable item_bg.xml 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 drawable 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
répondu Mithun Biswas 2017-08-09 11:35:29
<?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
répondu Query 2014-06-09 09:42:52

En plus de fournir un sélecteur drawable personnalisé pour le listSelector, vous devez également définir la ressource d'arrière-plan de l'élément de liste sur un sélecteur drawable similaire qui a des drawables différents pour les différents états.

0
répondu stan0 2014-03-13 11:35:50

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 définis l'arrière-plan de la vue en fonction de la sélection position==.

0
répondu Ripityom 2014-03-14 09:20:14

Je ne sais toujours pas pourquoi c'est que cela ne fonctionne pas. Mais la façon dont je l'ai trouvé est d'utiliser ma propre disposition simple_list_item_activated à transmettre à ArrayAdapter qui était fondamentalement la même, sauf pour définir la couleur du texte en blanc. 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, je l'ai fonctionne comme je le veux.

0
répondu RyanJohnstone 2014-03-14 10:44:44

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

Pls ne pense pas que c'est idiot, il suffit simplement de 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
répondu Prabaharan Rajendran 2015-02-07 12:55:13

À L'avenir, si quelqu'un vient ici en utilisant L'activité du tiroir de Navigation (fournie par Studio dans la fenêtre D'invite 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 utilisez ceci dans onNavigationItemSelected () dans MainActivity (vous n'avez pas besoin d'écrire cette fonction si vous utilisez l'activité de 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 la Condition IF else dans onNavigationItemSelected ()

0
répondu Chirag Joshi 2017-07-22 11:11:50

Cela a fonctionné pour moi : tiroir de menu implémenté non pas en remplissant la vue de navigation avec la 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'id de l'élément de menu qui correspond à l'activité sélectionnée comme cochée. et implémentez le fichier de sélection drawable dans votre tiroir de navigation comme ceci

    app:itemBackground="@drawable/drawer_menu_selector"

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

0
répondu antroid 2017-08-14 15:00:08