6
votes

Android ActionBar Custom Action View Town-Astuce

J'ai une application qui utilise une barre de support. Je suis une vue personnalisée pour une action.

Le truc est, que les actions par défaut affichent une touche d'outil lorsque je appuie longtemps, mais mon action personnalisée ne le fait pas. p>

Voici donc l'action par défaut (comme vous pouvez le constater, il y a un Conseil à outils): élément d'action avec embout d'outil p>

et voici mon action personnalisée (pas d'outils Pour celui-ci: /): Entrez la description de l'image ici p>

le XML pour ces 2: P>

    <menu
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:custom="http://schemas.android.com/apk/res-auto">

        <item
            android:visible="false"
            android:title="Clear history"
            android:id="@+id/action_clear_history"
            custom:showAsAction="always"
            android:icon="@drawable/ic_action_trash" />
        <item
            android:title="Open chat"
            android:id="@+id/action_chat"
            custom:showAsAction="always"
            custom:actionLayout="@layout/ab_chat" />
    </menu>


3 commentaires

Vous avez une réponse ou non? @Arthur


Je posterai une mise à jour dès que j'aurai le temps de vérifier cela;) Priorités que vous connaissez: D


Voir ma réponse, c'est facile à mettre en œuvre et son travail ma fin


6 Réponses :


0
votes

Comme vous utilisez une mise en page personnalisée pour le bouton, le code suivant doit fonctionner:

view.setOnLongClickListener(new OnLongClickListener() {
    public boolean onLongClick(View view) {
        Toast toast = Toast.makeText(v.getContext(), "Open chat", Toast.LENGTH_SHORT);
        toast.show();
        return true;
    }
}


0 commentaires

0
votes

Essayez d'ajouter la valeur withText à la fonctionnalité ShowaSaction. Quelque chose comme ça xxx


0 commentaires

0
votes

Utilisez la méthode Finditem code> sur le menu code> pour obtenir vos vues et définir votre onlongclicklistener code> sur votre vue.

Un changement de votre XML code> fichier de menu Ajouter une ligne Android: actionviewclass = "android.widget.imagebutton" code> (vous pouvez modifier ce Voir code>): p> xxx pré>

peut avoir une erreur ici pour obtenir votre parent Voir code> Je pense que cela devrait être la vue principale de la mise en page personnalisée. Vous pouvez tout d'abord utiliser après utilisation actionviewclass code> p>

MAINTENNE INTENEZ EN OncreateOptionMenu () Code> Pour l'événement de presse à long terme: P>

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        getSupportMenuInflater().inflate(R.menu.menu_xml, menu);
        /*
        As per your defined view in XML of MENU
        */ 
        ImageButton view = (ImageButton) menu.findItem(R.id.action_chat).getActionView();
        view.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View arg0) {
                // TODO Auto-generated method stub
                Display display = getWindowManager().getDefaultDisplay();
                Point size = new Point();
                display.getSize(size);
                int width = size.x;
                Toast toast = Toast.makeText(context, "Open Chat", Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.TOP, width - 200, 50); //your width and height
                toast.show();
                return false;
            }
        });

        return super.onCreateOptionsMenu(menu);
    }


5 commentaires

Semble un peu hacky. Et pourquoi ai-je besoin Android: actionviewclass ?


Parce que cela vous aidera à obtenir comme n'importe quel Voir pour contrôler votre Onlongress Cliquez sur l'événement.


En fait, vous n'avez pas besoin androidlactionviewclass pour y arriver. menuitem item_chat = menu.finditem (r.id.action_chat); fonctionne sans cela. Et puis je peux simplement mettre un onlongress listiers sur la vue action elle-même Voir item_chat_action_view = menuitemcompat.getactView (item_chat); .


J'attendrai encore plus pour voir si quelqu'un propose une réponse plus officielle, car il y a plus à cet outil-pointe que de placer un toast à des coordonnées fixes (la position exacte de l'élément + vibration lorsque l'info-bulle est affichée). Peut-être qu'il y a un appel API pour cela. S'il n'y aura pas de meilleure réponse, j'accepterai le vôtre.


Son bon, pas de problème, mais vous pouvez faire cette vibration avec une image digueable avec sélecteur.



0
votes

Créer une mise en page personnalisée et définissez cette mise en page sur une barre d'action, j'espère que c'est peut-être fonctionner pour vous xxx

et vous implémentez également comme suit ce xxx


2 commentaires

Salut! Mais que cela a à voir avec l'info-bulle?


Mon week-end est commencé, alors je réponds lundi si cela est possible avec une info-bulle et cette réponse est également une solution pour la question de nous. Essaye ça



9
votes

Je ne pense pas qu'il y ait des appels d'API "officiels" pour cela. Je crois ajouter un vue.onclicklistener code> à votre vue personnalisée, car les autres réponses suggèrent, sont à peu près aussi bonnes que possible.

Ce que vous pouvez faire un peu mieux, cependant, calculez correctement la position pour le toast de pointe de l'outil. Je recommanderais simplement de copier et de coller l'extrait pertinent à partir de la classe ActionMenuitemView Code> (à partir du code source de la bibliothèque de support) car il traite de quelques cas spéciaux: P>

@Override
public boolean onLongClick(View v) {
    if (hasText()) {
        // Don't show the cheat sheet for items that already show text.
        return false;
    }

    final int[] screenPos = new int[2];
    final Rect displayFrame = new Rect();
    getLocationOnScreen(screenPos);
    getWindowVisibleDisplayFrame(displayFrame);

    final Context context = getContext();
    final int width = getWidth();
    final int height = getHeight();
    final int midy = screenPos[1] + height / 2;
    int referenceX = screenPos[0] + width / 2;
    if (ViewCompat.getLayoutDirection(v) == ViewCompat.LAYOUT_DIRECTION_LTR) {
        final int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
        referenceX = screenWidth - referenceX; // mirror
    }
    Toast cheatSheet = Toast.makeText(context, mItemData.getTitle(), Toast.LENGTH_SHORT);
    if (midy < displayFrame.height()) {
        // Show along the top; follow action buttons
        cheatSheet.setGravity(Gravity.TOP | GravityCompat.END, referenceX, height);
    } else {
        // Show along the bottom center
        cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height);
    }
    cheatSheet.show();
    return true;
}


0 commentaires

7
votes

manière facile et parfait, utilisez simplement android.support.v7.widget.tooltipcompat : xxx


2 commentaires

Disponible en API 8+ uniquement


Cela devrait être la réponse acceptée. Fonctionne aussi avec androidx.appcompat.widget.tooltipcompat et sur API 26 et plus, nous pourrions simplement faire la vue.SetToolTip ("....")