J'essaie d'implémenter la fonctionnalité qui, lorsque je clique longuement sur un élément de la liste, le mode action démarre et il sera possible de supprimer un ou plusieurs éléments.
Je commence dans DocumentsActivity
une recherche, qui démarre un fragment DocumentsFragment
avec un ListView et ses éléments. Le ListAdapter est initialisé et défini via l'appel de méthode setListAdapter (this.documentsAdapter)
dans onCreate of Fragment. J'ai défini plusieurs écouteurs sur la liste vue dans le onActivityCreated
dans le fragment:
protected void onCreate(Bundle savedInstanceState) { handleIntent(getIntent()); requestWindowFeature(5); super.onCreate(savedInstanceState); setContentView(R.layout.activity_documents); Toolbar mToolbar = (Toolbar) findViewById(R.id.tool_bar); setSupportActionBar(mToolbar); args = getIntent().getExtras(); if (findViewById(R.id.container_documents) != null && savedInstanceState == null) { showDocumentsFragment(); } }
En cliquant longuement sur un élément de liste, le mode action démarre et le menu documents_context_menu
semble être la barre d'action. Mais le problème est que la barre d'action apparaît au-dessus de la barre d'outils et que la barre d'outils ne disparaîtra pas (voir l'image).
J'ai essayé pour appeler getSupportActionBar (). hide ()
ou le définir sur null ou même utiliser un autre style / thème. Tout n'a pas fonctionné. Parfois, la barre d'outils bleue était complètement blanche, mais c'est tout.
Je n'ai absolument aucune idée de pourquoi la barre d'outils ne disparaîtra pas. Pouvez-vous nous donner quelques conseils?
Merci d'avance!
_____ Mise à jour 1 _____
Voici le styles.xml p>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:fitsSystemWindows">true</item> <item name="colorAccent">@color/darkblue100</item> <item name="android:actionOverflowButtonStyle">@style/ActionButtonOverflow</item> <item name="actionOverflowButtonStyle">@style/ActionButtonOverflow</item> <item name="android:actionMenuTextColor">@color/black</item> </style>
Et voici comment la barre d'action est définie dans l'activité:
public void onActivityCreated(Bundle savedInstanceState) { getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { getListView().setItemChecked(position, true); return true; }}); getListView().setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { menu.clear(); ((DocumentsActivity)getActivity()).getMenuInflater().inflate(R.menu.documents_context_menu, menu); return true; } }); super.onActivityCreated(savedInstanceState); }
6 Réponses :
Comme indiqué dans le lien fourni dans les commentaires, il vous suffit d'ajouter la ligne suivante à votre style AppTheme:
<item name="windowActionModeOverlay">true</item>
Cela indique simplement que le mode action doit superposer le contenu de la fenêtre au lieu de le pousser vers le bas , il indique que vous n'avez pas besoin d'espace réservé pour le mode action.
@MarcelHofgesang Comment définissez-vous alors le mode action? J'ai essayé de définir le mode d'action sur la barre d'outils au lieu d'une activité comme celle-ci: toolbar.startActionMode (callback);
?
oui j'ai essayé de cette façon aussi mais il y avait encore quelques bugs ... En fait, le mode action s'active quand le MultiChoiceModeListener
est appelé. Voir la description sur le site des développeurs Android developer.android.com/reference/android/widget /…
Ajouter:
//Remove selected selections public void removeSelection() { mSelectedItemsIds = new SparseBooleanArray(); }
Ou :
//Set action mode null after use public void setNullToActionMode() { if (mActionMode != null) mActionMode = null; }
Cela ne fait pas référence au problème que j'énonce. La suppression d'un élément de liste n'est pas le problème, juste la 2ème barre d'outils. De plus, ces méthodes ne sont pas applicables dans mon scénario.
Eh bien, pour autant que je passe par votre code et que je le comprends, vous avez fait tout ce que vous avez fourni à votre Toolbar pour agir comme ActionBar et utilisé le thème .NoActionBar sauf que selon Android Developer, vous devez également définir l'attribut windowActionBar sur false dans votre style. entrez la description du lien ici Le deuxième paragraphe l'efface.
J'espère que cela aide!
toutes ces réponses sont bonnes, vous devriez les essayer, mais ce dont vous avez besoin est un ContextualMenu
donc vous devez d'abord ajouter des vues à un registerForContextMenu ()
afin que le menu sache quels menus sont contextuels puis implémentez le onCreateContextMenu
de votre Activity
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 <code><a href="/reference/android /view/ActionMode.html#invalidate()">invalidate()</a></code> request return false; } });
puis implémentez onContextItemSelected ()
comme ceci:
@Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.edit: editNote(info.id); return true; case R.id.delete: deleteNote(info.id); return true; default: return super.onContextItemSelected(item); } }
alors vous devez effectuer une action sur les vues et implémenter AbsListView.MultiChoiceModeListener
puis appeler setChoiceMode ()
avec le argument code> CHOICE_MODE_MULTIPLE_MODAL
. comme ceci:
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); }
tout ce que j'ai dit et finalement plus, vous pouvez trouver dans cette documentation pour les développeurs Android
En fait, le problème était dû à différentes choses.
Tout d'abord, Ensuite, il y avait dans la mise en page de l'activité l'attribut Après tout, j'ai eu le problème automagiquement que les éléments de la liste ont disparu. Je l'ai corrigé en validant à nouveau mon fragment dans windowActionBar
a été défini true
, ainsi que l'attribut fitsSystemWindows.
J'ai supprimé les deux lignes dans styles.xml
layout_marginTop = "? actionBarSize"
que je n'ai pas vu, suivant dans une confusion totale. Mais cet attribut doit être présent, je le gère donc dans la méthode onActivityCreated
lorsque onCreateActionMode
et onDestroyActionMode
sont appelés. onDestroyActionMode
.public void onActivityCreated(Bundle savedInstanceState) {
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {...}
});
getListView().setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
LinearLayout ll = ((DocumentsActivity)getActivity()).findViewById(R.id.container_documents);
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) ll.getLayoutParams();
params.setMargins(0, 0, 0, 0);
ll.setLayoutParams(params);
((DocumentsActivity)getActivity()).getSupportActionBar().hide();
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.documents_context_menu, menu);
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) ll.getLayoutParams();
params.setMargins(0, R.attr.actionBarSize, 0, 0);
ll.setLayoutParams(params);
((DocumentsActivity)getActivity()).getSupportActionBar().show();
if (getFragmentManager() != null)
getFragmentManager()
.beginTransaction()
.detach(this)
.attach(this)
.commit();
}
});
super.onActivityCreated(savedInstanceState);
}
Dans Kotlin, en supposant que votre Activité
s'étend de AppCompatActivity
Vous devriez obtenir l'instance de la barre d'action d'assistance et appeler les méthodes
supportActionBar? .show ()
ou supportActionBar?.hide()
Si vous utilisez un fragment, vous pouvez accéder à la barre d'action depuis l'instance d'activité du fragment
(activité en tant qu'AppCompatActivity) .supportActionBar? .show ()
Pouvez-vous s'il vous plaît publier votre code Apptheme à partir de
styles.xml
etonCreate
là où voussetSupportActionBar
?Copie possible de Toolbar et Contextual ActionBar avec AppCompat-v7
@MayurGajra j'ai ajouté les sources
pouvez-vous partager votre fichier Manifest?
@AbhinavGupta il est là