2010-10-13 5 views
31

J'utilise un AlertDialog (voir le code ci-dessous) et je voudrais mettre une image avant chaque texte.Comment ajouter une icône avant chaque élément dans la boîte de dialogue d'alerte?

Par exemple, l'icône de messagerie texte puis « Email », icône Facebook puis texte « Facebook », etc.

En utilisant le code suivant, comment ajouter une icône avant chaque valeur de texte?

final CharSequence[] items = { "Email", "Facebook", "Twitter", "LinkedIn" }; 
AlertDialog.Builder builder = new AlertDialog.Builder(More.this); 
builder.setTitle("Share Appliction"); 
builder.setItems(items, new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int item) { 
     if (item == 0) { 

     } else if (item == 1) { 

     } else if (item == 2) { 

     } else if(item == 3) { 

     } 
    } 
}); 
AlertDialog alert = builder.create(); 
alert.show(); 
+0

http://stackoverflow.com/questions/7792931/how-to-design-single-selection-dialog – UMAR

Répondre

2

Faire quelque chose comme ceci:

ViewGroup layout=new LinearLayout(context); 
TextView tv=new TextView(context); //your text 
tv.setText("my text"); 
ImageView imageView=new ImageView(context); //your icon 
//filling image view with icon bitmap (in this case from resource) 
imageView.setImageBitmap(BitmapFactory.decodeStream(context.getResources().openRawResource(resourceId))); 
//ensuring that icon size will be more or less like text height 
imageView.setAdjustViewBounds(true); 
imageView.setMaxHeight((int)(tv.getLineHeight()*1.5)); 
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
layout.addView(imageView); //adding icon 
tv.setGravity(Gravity.BOTTOM|Gravity.LEFT); 
layout.addView(tv); //adding text 

idée totale est de créer la mise en page/viewgroup et ajouter l'icône + texte + tout ce que vous voulez dans viewgroup

+0

comment l'associer à l'alerte? – UMAR

+0

AlertDialog contient généralement ListView qui affiche les messages. Alors essayez d'obtenir comme AlertDialog.getListView(); Puis ajoutez votre mise en page contenant des éléments entiers avec Icon/Text add to listView. comme: AlertDialog.getListview(). add (layout) – barmaley

77

Vous devez utiliser une coutume ListAdapter ajouter votre image. Sur le chemin est de sous-classer le ArrayAdapter (utilisé par défaut par le AlertDialog). Voici un exemple:

final Item[] items = { 
    new Item("Email", android.R.drawable.ic_menu_add), 
    new Item("Facebook", android.R.drawable.ic_menu_delete), 
    new Item("...", 0),//no icon for this one 
}; 

ListAdapter adapter = new ArrayAdapter<Item>(
    this, 
    android.R.layout.select_dialog_item, 
    android.R.id.text1, 
    items){ 
     public View getView(int position, View convertView, ViewGroup parent) { 
      //Use super class to create the View 
      View v = super.getView(position, convertView, parent); 
      TextView tv = (TextView)v.findViewById(android.R.id.text1); 

      //Put the image on the TextView 
      tv.setCompoundDrawablesWithIntrinsicBounds(items[position].icon, 0, 0, 0); 

      //Add margin between image and text (support various screen densities) 
      int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f); 
      tv.setCompoundDrawablePadding(dp5); 

      return v; 
     } 
    }; 


new AlertDialog.Builder(this) 
    .setTitle("Share Appliction") 
    .setAdapter(adapter, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int item) { 
      //... 
     } 
    }).show(); 

Voici la classe article

public static class Item{ 
    public final String text; 
    public final int icon; 
    public Item(String text, Integer icon) { 
     this.text = text; 
     this.icon = icon; 
    } 
    @Override 
    public String toString() { 
     return text; 
    } 
} 
+1

Y at-il un moyen de définir la taille drawable? – Muzikant

+1

Peu importe, juste trouvé comment faire ... appeler setBounds avec la taille requise, puis appeler setCompoundDrawables au lieu de setCompoundDrawablesWithIntrinsicBounds – Muzikant

+0

Salut, cela fonctionne, mais la taille du texte d'un élément n'est pas la valeur par défaut - il est trop grand . Des pensées comment je peux le régler à la taille des textes par défaut? – Nedko

1

à l'échelle des images:

//Put the image on the TextView 
int dp50 = (int) (50 * getResources().getDisplayMetrics().density + 0.5f); 
Drawable dr = getResources().getDrawable(R...YOUR_DRAWABLE); 
Bitmap bitmap = ((BitmapDrawable) dr).getBitmap(); 
Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, dp50, dp50, true)); 
tv.setCompoundDrawablesWithIntrinsicBounds(d, null, null, null); 

// Add margin between image and text (support various screen densities) 
int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f); 
tv.setCompoundDrawablePadding(dp10); 
1

J'aime la solution de Tom Esterez mais vous recommandons d'utiliser la fonction par rapport à la place pour RTL soutien.

Il faut donc utiliser ceci:

tv.setCompoundDrawablesRelativeWithIntrinsicBounds(items[position].iconID, 0, 0, 0); 

au lieu de ceci:

tv.setCompoundDrawablesWithIntrinsicBounds(items[position].iconID, 0, 0, 0); 
Questions connexes