6
votes

La barre d'outils ne disparaîtra pas en mode action

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);
}


5 commentaires

Pouvez-vous s'il vous plaît publier votre code Apptheme à partir de styles.xml et onCreate là où vous setSupportActionBar ?


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à


6 Réponses :


3
votes

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.


2 commentaires

@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 /…



1
votes

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;
    }


1 commentaires

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.



2
votes

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!


0 commentaires

2
votes

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


0 commentaires

1
votes

En fait, le problème était dû à différentes choses. Tout d'abord, windowActionBar a été défini true , ainsi que l'attribut fitsSystemWindows. J'ai supprimé les deux lignes dans styles.xml

Ensuite, il y avait dans la mise en page de l'activité l'attribut 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.

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 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);
}


0 commentaires

1
votes

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 ()


0 commentaires