J'ai récemment commencé à utiliser Android barres d'action et barres d'actions contextuelles (CAB).
J'ai juste une activité qui est une ListActivity. Fondamentalement, j'utilise le code suivant coupé pour "activer" le CAB:
ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
// Here you can do something when items are selected/de-selected,
// such as update the title in the CAB
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
// Respond to clicks on the actions in the CAB
switch (item.getItemId()) {
case R.id.menu_delete:
deleteSelectedItems();
mode.finish(); // Action picked, so close the CAB
return true;
default:
return false;
}
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Inflate the menu for the CAB
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.context, menu);
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// Here you can make any necessary updates to the activity when
// the CAB is removed. By default, selected items are deselected/unchecked.
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// Here you can perform updates to the CAB due to
// an invalidate() request
return false;
}
});
La présentation de la liste:
<ImageView
Android:id="@+id/message_on_clipboard_icon"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_vertical"
Android:minWidth="30dp"
Android:padding="7sp"
Android:src="@Android:drawable/presence_online" >
</ImageView>
<LinearLayout
Android:id="@+id/linearLayout2"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@drawable/listitem_background"
Android:orientation="vertical" >
<TextView
Android:id="@+id/message"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginRight="5sp"
Android:fadingEdge="horizontal"
Android:singleLine="true"
Android:text="TextView"
Android:textAppearance="?android:attr/textAppearanceLarge" >
</TextView>
<LinearLayout
Android:id="@+id/linearLayout1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@drawable/listitem_background"
Android:orientation="horizontal" >
<TextView
Android:id="@+id/message_length"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginRight="5sp"
Android:text="@string/message_length"
Android:textAppearance="?android:attr/textAppearanceSmall" >
</TextView>
<TextView
Android:id="@+id/message_count"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginRight="5sp"
Android:text="TextView"
Android:textAppearance="?android:attr/textAppearanceSmall" >
</TextView>
<TextView
Android:id="@+id/date_label"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginRight="5sp"
Android:text="@string/date_label" >
</TextView>
<TextView
Android:id="@+id/date_message"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="TextView" >
</TextView>
</LinearLayout>
</LinearLayout>
Et dans main.xml:
<ListView
Android:id="@+Android:id/list"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
>
</ListView>
Maintenant, si je clique longuement sur un élément de la liste, le CAB s'affiche comme prévu:
J'utilise un MultiChoiceModeListener mais malheureusement les éléments de la liste sélectionnés ne changent pas l'arrière-plan comme dans l'exemple ici (fond bleu clair après la sélection d'un élément):
Dois-je utiliser un sélecteur personnalisé? Ou existe-t-il une procédure standard sur la façon dont Android gère cela et j'ai juste besoin de rendre mes LinearLayouts transparents? J'ai également essayé ce qui suit mais sans succès:
Arrière-plan de l'élément ListView via un sélecteur personnalisé
Ce serait formidable si quelqu'un pouvait m'orienter dans la bonne direction. Veuillez me faire savoir si vous avez besoin de plus de code d'application ou de fichiers xml.
Je n'ai jamais testé cela dans CHOICE_MODE_SINGLE, mais dans cette situation, cela fonctionne en procédant comme suit.
Lorsque vous sélectionnez un élément de liste, dans le code, appelez la méthode "setItemChecked (position, vérifié)" (sur l'instance ListView) pour cet élément de la liste.
Ajoutez ceci au XML pour les éléments ListView individuels:Android:background="?android:attr/activatedBackgroundIndicator"
Créez simplement un arrière-plan personnalisé appelé en cours de route:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/highlight" Android:state_activated="true"/>
<item Android:drawable="@color/normal"/>
</selector>
et définissez comme arrière-plan sur votre mise en page parent:
Android:background="@drawable/custom_background"
Essayant uniquement de prendre en charge les appareils ICS et plus), mais cette nouvelle disposition fait ce que vous essayez d'atteindre, en gardant la ligne sélectionnée en surbrillance.
adapter = new SimpleCursorAdapter(getActivity(),
Android.R.layout.simple_list_item_activated_1,
null,
from,
to,
0);
Pour tous ceux qui rencontrent toujours ce problème, veuillez vérifier votre Android: minSdkVersion. S'il est trop bas, la couleur d'arrière-plan du sélecteur peut ne pas fonctionner.