Aller au contenu

QuickActionBar


akex

Recommended Posts

Bonjour à tous,

suite à ce post (merci Cyril) : http://android.cyrilmottier.com/?p=274

j'ai décidé de regarder la vidéo du Google IO citée et suite à ça j'ai fait machine arrière sur mon listview expandable pour adopter la quickactionbar.

N'ayant pas trouvé les sources de twitter j'ai poursuivis mes recherches et suis tombé sur ces deux pages :

- http://code.google.com/p/simple-quickactions/ (une alternative)

- http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/ (le premier amélioré)

Je vous laisse découvrir tout ça, en espérant que ça vous aide dans le développement de votre UI.

Je vous encourage également à utiliser GreenDroid, qui permet déjà d'utiliser simplement dans vos programmes l'actionbar (cf. premier lien). Mon petit doigt me dit que la quickactionbar devrait apparaitre prochainement dans GreenDroid.

Quelques images pour vous donner un avant gout de quickaction

façon appli contacts / twitter

qc1.jpg

qc2.jpg

façon gallerie 3D

gl3d1.jpg

gl3d2.jpg

Lien vers le commentaire
Partager sur d’autres sites

Super effectivement !!

J'ai inclus une quick bar de ce genre dans une de mes applis, et j'ai aussi recherché les sources...

Et effectivement, on trouve les sources dans l'appli des contacts d'Android, mais ils font un truc super bas niveau, et bien compliqué.

Et surtout, je ne comprends pas pourquoi ils n'utilisent pas les popup windows, qui sont faites pour ca...

Emmanuel / Alocaly

Lien vers le commentaire
Partager sur d’autres sites

J'ajoute ma petite correction tant qu'on y est

Dans CustomPopupWindow, y a une petite erreur :

if (rootHeight > anchorRect.top) {

Remplacer par

if (rootHeight > anchorHeight) {

anchorHeight = anchor.getTop();

En effet, getLocationOnScreen donne la position sur l'écran et non par rapport au ViewGroup parent (notamment dans le cas d'un listview). Autant se baser sur la place restante dans le parent, c'est plus propre ----> View.getTop();

Exemple : mon cas est composé d'un listview sur lequel j'ai positionné un OnItemClickListener qui déclenche l'affichage d'une quickactionbar. Quand je cliiques sur ma deuxième ligne, il considère qu'il reste assez de place et le quickactionBar dépassé sur ma barre de titre ... Bof.

Lien vers le commentaire
Partager sur d’autres sites

trop cool.

j'avais vu la première version, mais la deuxième est effectivement beaucoup plus belle.

du coup je l'ai rajouté dans taskiller (désactivable par option), et c'est vrai que ça rend bien.

Attention tout de même, dans les Drawables, il en manque un sur les drawable mdpi (le top frame jesaispuquoi).

comme je n'ai gardé que les mdpi du coup ça compilait pas.

Donc si vous gardez le code de base ça risque d'avoir une tête bizarre sur les petites résolutions...(encoe que le 9 patch va surement corriger naturellement le problème)

Modifié par popolbx
Lien vers le commentaire
Partager sur d’autres sites

Quand on passe des heures à chercher sur le net (alors que le deuxième lien donné est dans les tous premiers sortis par Google ... La fatigue surement), faut bien en faire profiter.

Je n'ai pas vérifié si certaines images étaient en nine-patch ou non. Y a surement des modifs à apporter pour améliorer encore la chose :).

Lien vers le commentaire
Partager sur d’autres sites

Excellent, j'avais passé quelques heures hier à chercher comment faire ces QuickActions, j'étais tombé sur le premier lien et avais décidé de compléter cette première version... heureusement que j'ai fini par regarder ici, tout le boulot que je comptais faire est déjà fait dans le premier lien :p

Juste un bug que je ne comprends pas pour le moment : dans le cas des Quickactions façon Gallery3D, si on ne met pas de Drawable dans les ActionItems, ils n'apparaissent pas du tout (alors que le hierarchy viewer les indique bien comme étant créés). Surement un problème de layout.

Merci beaucoup Akex !

Modifié par Nivek
Lien vers le commentaire
Partager sur d’autres sites

Petite touche perso pour corriger un autre problème : la popup ne se ferme pas quand on clique sur un item.

Du coup j'ai remplacé dans QuickAction.java :

   if (listener != null) {
       container.setOnClickListener(listener);
   }

Par (en ayant pris soin de rajouter l'attribut final sur container et listener) :

   if (listener != null) {
       container.setOnClickListener(new OnClickListener() {

           @Override
           public void onClick(View v) {
               listener.onClick(container);
               window.dismiss();
           }
       });
   }

Lien vers le commentaire
Partager sur d’autres sites

  • 5 weeks later...

Salut les djeuns :)

J'ai pas mal avancé sur la refonte de mon application, et pour l'occasion j'avais fait une implémentation personnelle des QuickActionWindow. Cette implémentation avait pour objectif de me permettre de répondre à la problématique des "plugins", et j'ai donc mis en place pas mal de fonctionnalités tournant autour des intents. Cela aide cette énième implémentation à ne pas seulement être une redite, et apporte quelques nouvelles idées dans le domaine ;)

Voir ici : http://code.google.com/p/horaires-ter-sncf/wiki/QuickActionWindow

Le projet complet est sous licence BSD, je n'ai pas spécifiquement licencié cette partie, mais il s'agira dans tous les cas d'une BSD ou équivalente (en tous cas pas une GPL v3 ;)).

Morceau choisi typiquement représentatif de l'idée :

QuickActionWindow.Advertisement[] ads = new QuickActionWindow.Advertisement[] {
 new QuickActionWindow.MarketAdvertisement("my.package", ".Activity", 
   getString(R.string.advertisement), getResources().getDrawable(R.drawable.advertisement), 
   "Android Market not found"
 ), 
};
// All activities responding to intent will be added as action item in the window.
// If activity "my.pkg.Activity" is not found in the IntentItems added to the window,
// we'll instead add an item that will open Android Market to the details page of 
// "my.pkg" when user clicks on item.
window.addItemsForIntent(context, intent, errorCallback, advertisements);

Modifié par naholyr
Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

Je ne comprend pas bien la situation:

Je suis en train de tater le terrain pour créer une ActionBar avec des quickActions sur ma listView qui fonctionne à l'ancienne (listView+adapter). Mais si je comprends bien la seule manière c'est d'utiliser GreenDroid de Cyril car Google n'a pas sorti la version officielle des ActionBar et QuickActions (alors que L'app Twitter utilise ces fonctionnalités)?

J'avoue, je suis un peu perdu.

Est-ce que si j'utilise la méthode de Cyril pour faire mon ActionBar je pourrais ensuite faire mes QuickAction comme ceci http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/ sans soucis?

Surtout que GreenDroid permet la création de ListView assez facilement...

Lien vers le commentaire
Partager sur d’autres sites

Bon aprés quelques recherches j'ai compris la situation :|

Problème du jour:

J'ai mis en place un système de QuickAction dans ma listView mais je n'arrive pas à mettre plus de 2 items...que dois-je changer pour en ajouter davantage?

Merci d'avance,

Florent

Fix it

OK, j'ajoutais le bon en déclarant le mauvais. Sorry for that.

Lien vers le commentaire
Partager sur d’autres sites

Juste un bug que je ne comprends pas pour le moment : dans le cas des Quickactions façon Gallery3D, si on ne met pas de Drawable dans les ActionItems, ils n'apparaissent pas du tout (alors que le hierarchy viewer les indique bien comme étant créés). Surement un problème de layout.

Effectivement, j'ai le meme bug, et je ne le comprends pas trop pour le moment !

Bon, au pire, je me trouve une mini icone à mettre...

Emmanuel / Alocaly

Lien vers le commentaire
Partager sur d’autres sites

  • 3 weeks later...

Juste un bug que je ne comprends pas pour le moment : dans le cas des Quickactions façon Gallery3D, si on ne met pas de Drawable dans les ActionItems, ils n'apparaissent pas du tout (alors que le hierarchy viewer les indique bien comme étant créés). Surement un problème de layout.

Je viens de trouver, en fignollant 'SpyMyApps', le pourquoi du comment :

Dans ActionItem.xml, il y a une imageview et un textview.

L'image view a en height 'wrap_content', et le text view a 'fill_parent'.

Donc si tu ne mets pas d'images => pas de contenu, le parent fait 0 de hauteur, et on ne voit rien.

La solution : mettre wrap_content dans le text view aussi !

Emmanuel / Alocaly

Lien vers le commentaire
Partager sur d’autres sites

  • 3 weeks later...

Nouvelle pierre à l'édifice (malheureusement dispersé) : une p'tite méthode à rajouter dans QuickAction.java pour remplacer les imposantes Action Chooser standard par une jolie popup QuickAction :

   /**
	* Builds a QuickAction bubble containing all possible activities for a
	* given intent.
	* 
	* @param view
	*            The view which triggers the QuickAction bubble.
	* @param intent
	*            The intent you want to send.
	* @param excludeSelfPackage
	*            Set this to true if you need to exclude your application's own
	*            activities from this chooser.
	* @return The QuickAction containing all the possible actions. You have to
	*     	call {@link QuickAction}{@link #show()} then to display the
	*     	QuickAction. Be careful, returns null if there is no possible
	*     	action so you should test the return value before calling show()!
	*/
   public static QuickAction buildChooser(final View view, Intent intent, boolean excludeSelfPackage) {
       QuickAction qa = new QuickAction(view);
       PackageManager packageManager = view.getContext().getPackageManager();
       String selfPackage = view.getContext().getPackageName();

       List<ResolveInfo> list = packageManager.queryIntentActivities(intent, 0);

       // Sort the list
       Collections.sort(list, new ResolveInfo.DisplayNameComparator(packageManager));

       for (ResolveInfo res : list) {
           if (!excludeSelfPackage || !res.activityInfo.packageName.equals(selfPackage)) {
               // Add ActionItem for this intent
               final Intent finalIntent = new Intent(intent);
               finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
               ActionItem item = new ActionItem();
               item.setTitle(res.loadLabel(packageManager).toString());
               item.setIcon(res.loadIcon(packageManager));
               item.setOnClickListener(new View.OnClickListener() {

                   @Override
                   public void onClick(View v) {
                       view.getContext().startActivity(finalIntent);
                   }
               });
               qa.addActionItem(item);
           }
       }
       if (qa.actionList.size() > 0) {
           return qa;
       } else {
           return null;
       }
   }

Mon beson initial était de créer un Action Chooser qui permette de ne pas proposer à l'utilisateur un choix dangereux : ma propre activity, d'où le booleen 'excludeSelfPackage'. Au final ça remplace assez avantageusement les Action Chooser d'une manière générale.

Exemple d'utilisation:

       Intent intent = new Intent(Intent.ACTION_SEND);
       intent.setType("application/zip");
       intent.putExtra(Intent.EXTRA_STREAM, album);

       QuickAction qa = QuickAction.buildChooser(findViewById(R.id.btn_album_share), intent, true);
       if(qa != null) {
           qa.show();
       } else {
           Toast.makeText(this, R.string.error_no_send_activity, Toast.LENGTH_LONG).show();
       }

Côté layout des ActionItems, j'ai pas mal bidouillé aussi et maintenant j'utilise cette version :

<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content" 
   android:clickable="true"
   android:focusable="true"
   android:background="@drawable/action_item_btn">

   <ImageView
       android:id="@+id/icon" 
       android:layout_width="20sp" 
       android:layout_height="fill_parent"
       android:layout_gravity="left"/>

   <TextView 
       android:id="@+id/title"
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center_vertical"
       android:paddingLeft="5dip"
       android:paddingRight="10dip"
       android:text="Chart"
       android:textColor="#fff"
       android:textSize="20sp"/>

</LinearLayout>         

J'ai fixé la taille du texte et la largeur de l'icône à 20sp qui me semble être une taille correcte pour à la fois la lisibilité et le choix d'un item avec les doigts. J'ai dû fixer la largeur de l'icône car les drawables renvoyés par le packagemanager ont des tailles différentes.

Modifié par Nivek
  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...