AlertDialogbutton的图像

是否可以添加绘图到AlertDialog的正面负面中性button? 如果是,那么如何?

Solutions Collecting From Web of "AlertDialogbutton的图像"

由于onPrepareDialog已被弃用,您可以改用onShowListener

你也应该设置可绘制边界,或者将它放在最左边。

下面的代码输出

下面的代码输出

 public class MyDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final AlertDialog dialog = new AlertDialog.Builder(getActivity()) .setTitle("My Dialog") .setNegativeButton("Cancel", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).setPositiveButton("Play", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).create(); dialog.setOnShowListener(new OnShowListener() { @Override public void onShow(DialogInterface dialogInterface) { Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); // if you do the following it will be left aligned, doesn't look // correct // button.setCompoundDrawablesWithIntrinsicBounds(android.R.drawable.ic_media_play, // 0, 0, 0); Drawable drawable = getActivity().getResources().getDrawable( android.R.drawable.ic_media_play); // set the bounds to place the drawable a bit right drawable.setBounds((int) (drawable.getIntrinsicWidth() * 0.5), 0, (int) (drawable.getIntrinsicWidth() * 1.5), drawable.getIntrinsicHeight()); button.setCompoundDrawables(drawable, null, null, null); // could modify the placement more here if desired // button.setCompoundDrawablePadding(); } }); return dialog; } } 

onCreateDialog构buildAlertDialog ,可以使用AlertDialog中的以下代码将图像添加到正面button:

 @Override protected void onPrepareDialog(int id, Dialog dialog) { super.onPrepareDialog(id, dialog); AlertDialog alertDialog = (AlertDialog)dialog; Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); button.setCompoundDrawablesWithIntrinsicBounds(this.getResources().getDrawable( R.drawable.icon), null, null, null); } 

尝试添加绘图到onCreateDialog方法中的button似乎不工作。

这可以通过使用getButton()方法获取对button的引用来完成:

 alert.show(); Button email = alert.getButton(AlertDialog.BUTTON_NEUTRAL); email.setBackgroundResource(R.drawable.email); 

请注意,您必须在调用show()方法后使用getButton()方法,否则您将得到一个NullPointerException ..

您不能在onCreateDialog中添加button,并且必须在onPrepareDialog中执行它,因为AlertDialog是通过android以非常特殊的方式处理的:

当你使用alert对话框时,实际上并没有真正的对话框的引用,你使用AlertDialog.Builder.create()得到的对象只是一个内部控制器的面。

在创build之前,jvm中没有这样的控制器。 只是门面。 所以,直到这个方法被调用(在onCreateDialog结束,如果你让你的活动pipe理自己的对话框),真正的控制器不存在,真正的button不都不。

全新的SOF评论员Stéphane

正如@aaronvargas所说,使用onShowListener 。 我会稍微改进他的答案,因为对于较旧/较小的设备,图像与文本重叠。 这是onShow代码:

 @Override public void onShow(DialogInterface dialogInterface) { Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.your_img, 0, 0, 0); Utils.centerImageAndTextInButton(button); } 

下面是一个实用function,将一个左图像和文本居中在一个Button

 public static void centerImageAndTextInButton(Button button) { Rect textBounds = new Rect(); //Get text bounds CharSequence text = button.getText(); if (text != null && text.length() > 0) { TextPaint textPaint = button.getPaint(); textPaint.getTextBounds(text.toString(), 0, text.length(), textBounds); } //Set left drawable bounds Drawable leftDrawable = button.getCompoundDrawables()[0]; if (leftDrawable != null) { Rect leftBounds = leftDrawable.copyBounds(); int width = button.getWidth() - (button.getPaddingLeft() + button.getPaddingRight()); int leftOffset = (width - (textBounds.width() + leftBounds.width()) - button.getCompoundDrawablePadding()) / 2 - button.getCompoundDrawablePadding(); leftBounds.offset(leftOffset, 0); leftDrawable.setBounds(leftBounds); } } 

最后一个函数使用Button的宽度来计算,所以你必须检查你是否在正确的位置调用了这个函数。 也就是说,宽度应该不是零。 在这种情况下,从onShow调用它正确的地方:)。

1.首先创build一个新的布局文件来存储imagebuttons:new_layout.xml;

 <?xml version="1.0" encoding="UTF-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_margin="15dp" android:gravity="center_horizontal" android:background = "#FFFFFF" android:orientation="horizontal"> <!-- game button --> <ImageButton android:id="@+id/game" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_margin="5dp" android:layout_gravity="bottom" android:background = "#00ffffff" android:src="@drawable/game"/> <!-- browser button --> <ImageButton android:id="@+id/browser" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_margin="5dp" android:layout_gravity="bottom" android:background = "#00ffffff" android:src="@drawable/browser"/> <!-- email button --> <ImageButton android:id="@+id/email" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_margin="5dp" android:layout_gravity="bottom" android:background = "#00ffffff" android:src="@drawable/email"/> </LinearLayout> 

2.将下面的代码添加到您要对话显示的位置:

  final AlertDialog alertDialog = new AlertDialog.Builder(TalkerActivity.this).create(); alertDialog.show(); Window win = alertDialog.getWindow(); win.setContentView(R.layout.new_layout); //Game ImageButton game_btn = (ImageButton)win.findViewById(R.id.game); game_btn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub } }); //Browser ImageButton browser_btn = (ImageButton)win.findViewById(R.id.browser); browser_btn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub } }); //Email ImageButton email_btn = (ImageButton)win.findViewById(R.id.email); email_btn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub } }); 

链接: http : //blog.csdn.net/willproud/article/details/9191971