0

Je suis aux prises avec ce terrible bug. Il semble que tout fonctionne à la place celui-ci android:state_activated. J'essayais de mettre <item> dans un ordre différent, mais cela n'aide pas. De plus, lorsque l'application démarre l'option fragment choisi par défaut dans le tiroir est pas trop coloré (comme dans la version par défaut) ...Le sélecteur de tiroir Android state_activated ne fonctionne pas et ne colorie pas defeault article sélectionné

Ceci est mon selector:

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

Ceci est la mise en page pour un article:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="horizontal" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 


    <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:id="@+id/itemIcon"/> 
    <TextView 
      android:id="@android:id/text1" 
      android:duplicateParentState="true" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="32sp" 
      /> 

</LinearLayout> 

Ceci est la disposition du tiroir:

<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:choiceMode="singleChoice" 
      android:paddingTop="10dp" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="0dp" 
      android:background="#cccc" 
      android:drawSelectorOnTop="false" 
      android:listSelector="@drawable/my_drawer_selector" 
      tools:context="com.myPackage.app.NavigationDrawerFragment"/> 

Th est est en onCreateView (j'ai ajouté ici mon adaptateur seulement, le reste est par défaut)

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     mDrawerListView = (ListView) inflater.inflate(
       R.layout.drawer_dashboard, container, false); 
     mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       selectItem(position); 
      } 
     }); 
     String[] items = { 
       getString(R.string.Contacts), 
       getString(R.string.Data) 
     }; 

     Integer[] images = { 
       R.drawable.ic_contacts, 
       R.drawable.ic_data 
     }; 
     mDrawerListView.setAdapter(new MyCustomDrawerListAdapter(getActivity(), items, images)); 

//This should indicate the first coloring but it doesn't 
     mDrawerListView.setItemChecked(mCurrentSelectedPosition, true); 
     return mDrawerListView; 
    } 

Et à la fin, mon MyCustomDrawerListAdapter:

private class MyCustomDrawerListAdapter extends ArrayAdapter<String>{ 
     private final Activity context; 
     private final String[] itemname; 
     private final Integer[] imgid; 

     public MyCustomDrawerListAdapter(Activity context, String[] itemname, Integer[] imgid){ 
      super(context, R.layout.my_menu_drawer_item, itemname); 
      this.context = context; 
      this.itemname = itemname; 
      this.imgid = imgid; 
      for (Integer anImgid : imgid) { 
       System.out.println(" image id " + anImgid); 
      } 
     } 
     public View getView(int position,View view,ViewGroup parent) { 
      if (view == null) { 
       view = getActivity().getLayoutInflater().inflate(R.layout.my_menu_drawer_item, null, false); 
      } 

      ((TextView) view.findViewById(android.R.id.text1)) 
        .setText(getItem(position)); 
      ((ImageView) view.findViewById(R.id.itemIcon)) 
        .setImageResource(imgid[position]); 
      return view; 

     } 

    } 
+0

Quelle version ciblez-vous et sur quelle version testez-vous? – Juan

+0

Ciblage 25, test sur 21 – soommy12

Répondre

1

J'ai eu quelques problèmes lors de l'exécution sur api 21 appareils.

La façon dont je résolu le probles était:

Dans le ListView comme fond la couleur de surbrillance (colorAccent dans mon cas).

android:background="@color/colorAccent" 

et également définir le sélecteur ListView à:

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
     <solid android:color="@color/colorAccent"/> 
</shape> 

Pour l'élément de tiroir, le LinearLayout fond du conteneur de niveau supérieur pour

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@android:color/transparent" android:state_selected="true"/> 
    <item android:drawable="@android:color/transparent" android:state_pressed="true"/> 
    <item android:drawable="@android:color/transparent" android:state_activated="true"/> 
    <item android:drawable="@color/colorMenuBackground"/> 
</selector> 

Dans mon cas:

<color name="colorMenuBackground">#FFFFFF</color> 

Pour sélectionner le premier élément, dans onPostCreate() de votre principale course d'activité:

setItemChecked(0,true); 

sur la listview (0 est la position de l'élément)

En fait c'est comment j'ai cette méthode qui se synchronise également avec le bouton menu de Hamburguer:

@Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     actionBarDrawerToggle.syncState(); 
     drawerList.setItemChecked(1,true); 

    } 
+0

Je ne sais pas comment mais ça fonctionne! Mais quand l'application démarre, aucun élément des tiroirs n'est coloré :( – soommy12

+0

Dans mon cas, je l'ai comme ça mais, je suppose que vous pouvez appeler selectItem (position), à la fin de onCreateView pour sélectionner un élément de la liste. J'ai trouvé qu'il y a un bogue dans l'émulateur, cela ne rend pas bien l'affichage de l'option lorsque l'application est démarrée, mais cela n'arrive pas sur les vrais périphériques – Juan

+0

Désolé, voir si en plus de coché vous pouvez définir la vue à – Juan

-1

Vous devez créer une nouvelle couleur de nom du paquet à l'intérieur le dossier res, à l'intérieur du paquet de couleur créer votre fichier my_drawer_selector

utiliser ensuite ce fichier avec

"@color/my_drawer_selector" 

Ce besoin d'être comme ceci:

enter image description here

nav_item_state_list est votre my_drawer_selector

+0

Voulez-vous dire que je dois mettre mon tiroir en couleurs dans les valeurs? Pourquoi? – soommy12

+0

Non, vous avez vraiment besoin de créer un nouveau nom de package en couleur dans le dossier res, puis à l'intérieur de mettre votre fichier xml. Je sais que cela semble étrange mais c'est comme ça que ça marche – Vodet

+0

Je n'ai aucune idée de ce dont vous parlez ... – soommy12