Изображения для кнопок AlertDialog - PullRequest
10 голосов
/ 09 сентября 2010

Можно ли добавить элементы рисования для кнопок положительный , отрицательный и нейтральный на AlertDialog?Если да, то как?

Ответы [ 6 ]

14 голосов
/ 30 декабря 2013

Поскольку onPrepareDialog устарело, вместо него можно использовать onShowListener.

Также вы должны установить границы рисования, иначе они будут расположены далеко слева.

Вывод кода ниже

Output of Code below

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;
    }
}
7 голосов
/ 09 сентября 2010

После того, как вы ввели AlertDialog в onCreateDialog, вы можете использовать следующий код в onPrepareDialog, чтобы добавить изображение к положительной кнопке:

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

}

Попытка добавить элемент drawable к кнопке в методе onCreateDialog, похоже, не работает.

5 голосов
/ 31 марта 2012

Это можно сделать, получив ссылку на кнопку с помощью метода getButton ():

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

Обратите внимание, что вы должны использовать getButton () ПОСЛЕ вызова метода show (), в противном случае вы получите исключение NullPointerException.

5 голосов
/ 09 апреля 2011

Вы не можете добавить кнопки в onCreateDialog и ДОЛЖНЫ делать это в onPrepareDialog, потому что AlertDialog обрабатывается совершенно особым образом android:

вы на самом деле не держите ссылку на настоящий диалог, когда используете диалоговое окно оповещения, объект, который вы получаете с помощью AlertDialog.Builder.create (), это просто лицо внутреннего контроллера.

И до того, как на самом деле вызывается create, в jvm такого контроллера нет. Просто фасад. Таким образом, до тех пор, пока этот метод не будет вызван (в конце onCreateDialog, если вы позволите своей деятельности управлять своими собственными диалоговыми окнами), реального контроллера не существует, а реальных кнопок тоже нет.

новый комментатор SOF, Стефан

2 голосов
/ 22 марта 2014

Как сказал @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);
}

Вот вспомогательная функция для центрирования левого изображения и текста внутри 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 голос
/ 27 июня 2013

1. Сначала создайте новый файл макета для хранения кнопок изображения: 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...