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.xmletonCreatelà 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à