2010-08-22 2 views
8

J'essaie d'ajouter un badge à l'un des boutons de mon activité. En ce moment j'essaye de faire le xml. Le bouton avec le badge, devrait ressembler à ceci:Positionner une bulle de badge sur le côté supérieur gauche d'un bouton

alt text

J'ai déjà fait la bulle et le texte à l'intérieur à l'aide d'un RelativeLayout:

<RelativeLayout android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 

      <ImageView android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:adjustViewBounds="true" 
       android:src="@drawable/badge" 
       android:layout_centerInParent="true"/> 

      <TextView android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:textStyle="bold" 
         android:text="2" 
         android:layout_centerInParent="true" /> 
     </RelativeLayout> 

Mais je ne peux pas trouver un moyen pour le placer là et le faire travailler sur le portrait et le paysage avec le même xml.

Les buttoms dans le Activity sont comme ceci:

<Button android:id="@+id/new_releases_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/ic_button_selector" 
      android:text="@string/new_releases_title" 
      android:textColor="#FFFFFF" 
      android:textSize="20sp" 
      android:gravity="center_vertical" 
      android:paddingLeft="12dp" 
      android:layout_marginTop="15dp" 
      android:layout_below="@id/coming_soon_button" 
      android:onClick="newReleaseClick" 
      android:layout_centerHorizontal="true" /> 

     <Button android:id="@+id/top_sellers_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/ic_button_selector" 
      android:text="@string/top_sellers_title" 
      android:textColor="#FFFFFF" 
      android:textSize="20sp" 
      android:gravity="center_vertical" 
      android:paddingLeft="12dp" 
      android:layout_marginTop="15dp" 
      android:layout_below="@id/new_releases_button" 
      android:onClick="topSellersClick" 
      android:layout_centerHorizontal="true" /> 

et voici les deux ressources:

alt text alt text

Comment dois-je faire le xml?

EDIT: Meilleure approche à ce jour, mais il ne fonctionne toujours pas:

<?xml version="1.0" encoding="utf-8"?> 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <Button android:id="@+id/discounts_button" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:background="@drawable/ic_button_selector" 
       android:text="@string/discounts_title" 
       android:textColor="#FFFFFF" 
       android:textSize="20sp" 
       android:onClick="discountsClick" 
       android:layout_marginTop="40dp" 
       android:layout_marginLeft="20dp"/> 

     <RelativeLayout android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="top|left"> 

      <ImageView android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:adjustViewBounds="true" 
        android:src="@drawable/badge" 
        android:layout_centerInParent="true"/> 

      <TextView android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:textStyle="bold" 
          android:text="20" 
          android:layout_centerInParent="true" /> 
     </RelativeLayout> 
</FrameLayout> 

Répondre

7

Utilisez un FrameLayout (au lieu de RelativeLayout) et le bouton et l'image mis en elle.

Position de l'image (cirle numéro) et le bouton via

android:layout_gravity="top|left" 
android:layout_marginTop="Xdp" 
android:layout_marginLeft="Xdp" 

à vos goûts.

+0

Cela ressemble à la façon correcte mais je ne peux toujours pas le faire fonctionner. Il est logique d'ajouter 'marginTop' et' marginLeft' au badge, mais ils devraient être négatifs. Cette position en dehors de la vue. Donc, à la place, j'ai ajouté 'marginTop' et' marginLeft' au bouton, mais ces valeurs sont ignorées. Je ne pouvais pas encore comprendre pourquoi. Je vais éditer la question avec la meilleure approche jusqu'à présent. – Macarse

+0

oui, c'est correct. aucune marge négative à l'image (bien que je n'ai pas essayé si cela fonctionnerait aussi bien), vous pouvez travailler avec les marges haut/gauche pour l'image et le bouton que vous le souhaitez. mais cela a du sens de cette façon: la position en haut à gauche de la FrameLayout est le coin supérieur gauche de l'image, donc vous devez déplacer le bouton un peu vers la droite et vers le bas. –

+0

Cool, en ajoutant 'android: layout_gravity =" top | left "' au bouton a fait fonctionner, mais il coupe le bouton puisque ma largeur et la hauteur de mon parent sont "wrap_content". Je ne veux pas forcer quelque chose comme 'android: layout_height =" 60dp "' qui a l'air bien. Toute idée d'une meilleure façon de résoudre cela? – Macarse

3

Je dirais que cela devrait être facile avec FrameLayout:

<FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" android:layout_marginTop="15dp"> 
     <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="15dip"> 
     <Button android:id="@+id/new_releases_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/ic_button_selector" 
     android:text="@string/new_releases_title" 
     android:textColor="#FFFFFF" 
     android:textSize="20sp" 
     android:gravity="center_vertical" 
     android:paddingLeft="12dp" 
     android:layout_below="@id/coming_soon_button" 
     android:onClick="newReleaseClick"/> 
    </FrameLayout> 
    <RelativeLayout android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <ImageView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:adjustViewBounds="true" 
      android:src="@drawable/badge" 
      android:layout_centerInParent="true"/> 
     <TextView android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textStyle="bold" 
        android:text="2" 
        android:layout_centerInParent="true" /> 
    </RelativeLayout> 
</FrameLayout> 

Vous aurez probablement besoin d'ajuster les marges.

EDIT:

Ajout du android:layout_gravity="top|left" ressemblera à ceci:

alt text

+0

Cela n'a pas fonctionné pour moi. Le badge est visible sur le dessus du bouton, et le 'android: layout_marginTop' semble ignorer d'une manière ou d'une autre. – Macarse

+0

Bizarre .. alors essayez xml mis à jour sur la réponse (vous pouvez vouloir ajuster padding de FrameLayout interne). Essayez également d'utiliser RelativeLayout comme conteneur de niveau supérieur à la place de FrameLayout. –

+0

ajoute-t-il android: layout_gravity = "top | center" au bouton et RelativeLayout font une différence? le code semble ok jusqu'ici à première vue. –

Questions connexes