如何在警报对话框中的每个项目之前添加一个图标?

我正在使用AlertDialog(请参阅下面的代码),并希望在每个文本之前放置一个图像。

例如,电子邮件图标然后是文本“电子邮件”,Facebook图标然后文本“脸谱”等

使用下面的代码,如何在每个文本值之前添加一个图标?

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

Solutions Collecting From Web of "如何在警报对话框中的每个项目之前添加一个图标?"

您必须使用自定义ListAdapter来添加图像。 在途中是派生ArrayAdapter (由AlertDialog默认使用)。 这里是一个例子:

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

这是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; } } 

做这样的事情:

 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 

总的想法是创build布局/视图组,并添加图标+文本+任何你想要的视图组

缩放图像:

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

我喜欢Tom Esterez的解决scheme,但推荐使用相对函数来代替RTL支持。

所以使用这个:

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

而不是这个:

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