代码之家  ›  专栏  ›  技术社区  ›  UMAR-MOBITSOLUTIONS

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

  •  34
  • UMAR-MOBITSOLUTIONS  · 技术社区  · 15 年前

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

    例如,电子邮件图标,然后文本“电子邮件”,Facebook图标,然后文本“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();
    
    4 回复  |  直到 8 年前
        1
  •  82
  •   Tom Esterez    8 年前

    你需要定制 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();
    

    这是项目类

    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;
        }
    }
    
        2
  •  2
  •   naXa stands with Ukraine    10 年前

    这样做:

    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
    

    总的想法是创建布局/视图组并将icon+text+添加到视图组中

        3
  •  1
  •   Jared Rummler mehmoodnisar125    10 年前

    要缩放图像:

    //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);
    
        4
  •  1
  •   Alexander Farber    8 年前

    我喜欢 Tom Esterez 的解决方案,但建议使用相对函数代替RTL支持。

    所以使用这个:

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

    而不是这个:

    tv.setCompoundDrawablesWithIntrinsicBounds(items[position].iconID, 0, 0, 0);
    
    推荐文章