2010-10-13 14 views
31

Sto utilizzando un AlertDialog (vedere il codice qui sotto) e vorrei mettere un'immagine prima di ogni testo.Come aggiungere l'icona prima di ogni elemento in dialogo avviso?

Ad esempio, l'icona-mail, allora il testo "Email", Facebook icon quindi il testo "Facebook", ecc

utilizzando il seguente codice, come aggiungere un'icona prima di ogni valore di testo?

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

risposta

2

fare qualcosa di simile:

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 

idea totale è di creare layout/viewgroup e aggiungere l'icona + testo + quello che volete in viewgroup

+0

come associarlo con l'allerta? – UMAR

+0

AlertDialog solito contiene ListView che mostra i messaggi. Quindi prova ad ottenere come AlertDialog.getListView(); E poi aggiungi il tuo layout contenente tutto il materiale con Icon/Text aggiungi a listView. come: AlertDialog.getListview(). add (layout) – barmaley

77

È necessario utilizzare un costume ListAdapter da aggiungere la tua immagine. Sul modo è quello di sottoclasse il ArrayAdapter (utilizzato per impostazione predefinita dal AlertDialog). Ecco un esempio:

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

Ecco la classe Item

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

C'è un modo per impostare la dimensione del drawable? – Muzikant

+1

Non importa, ho appena scoperto come farlo ... chiama setBounds con la dimensione richiesta e poi chiama setCompoundDrawables invece di setCompoundDrawablesWithIntrinsicBounds – Muzikant

+0

Ciao, funziona, ma la dimensione del testo di un elemento non è l'impostazione predefinita - è troppo grande . Qualche idea su come posso impostarla sulla dimensione predefinita dei testi? – Nedko

1

per scalare le immagini:

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

mi piacciono Tom Esterez 's soluzione, ma consiglia di utilizzare la funzione relativa, invece, per RTL supporto.

Così utilizzare questo:

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

invece di questo:

tv.setCompoundDrawablesWithIntrinsicBounds(items[position].iconID, 0, 0, 0); 
Problemi correlati