Как разместить значок в заголовке настраиваемого диалогового окна

Я хотел бы разместить объект для рисования в строке заголовка диалогового окна. Я пробовал следующее:

final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_LEFT_ICON);
dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.some_icon);
dialog.setTitle(R.string.my_dialog_title);
dialog.setContentView(R.layout.my_dialog_layout);
...

Значок не отображается, но заголовок сдвигается немного вправо. Кажется, что диалоговое окно резервирует место для рисования, но не рисует его. Я пробовал несколько разных значков (также из ресурсов Android), но ни один из них не работал.


person Tom    schedule 26.11.2010    source источник


Ответы (6)


Позвоните setFeatureDrawableResource() после show().

Понятия не имею, почему это работает. :)

person Reuben Scratton    schedule 26.11.2010
comment
Используйте это, и вы положите это перед шоу. requestWindowFeature - ›setContentView -› setFeatureDrawableResource - person Billy Bob Bain; 27.02.2011
comment
Это также может быть использовано в действии - person Paweł Obrok; 22.11.2011
comment
Кажется, достаточно просто поместить его после setContentView (...) - person pgsandstrom; 01.12.2011
comment
Любой способ установить прослушиватель onClick на этом чертеже? - person Peter Ajtai; 14.03.2012

Вот решение

final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_LEFT_ICON);
dialog.setTitle(R.string.my_dialog_title);
dialog.setContentView(R.layout.my_dialog_layout);
dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,R.drawable.some_icon);
dialog.show(); 

Если вы хотите, чтобы ваш диалог выглядел как действие, добавьте тему в диалог, как показано ниже.

final Dialog dialog = new Dialog(this,AlertDialog.THEME_HOLO_LIGHT);  
person Kirit Vaghela    schedule 22.03.2012

Вы также можете расширить класс Dialog следующим образом:

public class CustomDialog extends Dialog {

    public CustomDialog(Context context) {
        super(context);
        setTitle("Some Title");
        requestWindowFeature(Window.FEATURE_LEFT_ICON);
        setContentView(R.layout.my_layout);
    }

    @Override
    protected void onStart() {
        setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.my_icon);
        super.onStart();
    }

то есть вы готовите функцию окна в конструкторе, а затем устанавливаете конкретный ресурс в onStart.

Итак, в вашем основном коде вы можете просто использовать:

    CustomDialog cd = new CustomDialog(getActivity());
    rd.show();
person Carlos    schedule 07.08.2013
comment
+1 за решение, которое работает, когда вы переопределяете onCreateView(...) вместо onCreateDialog(...). - person Kevin Krumwiede; 26.08.2015

Вот решение. Следуйте рецепту, и ваша иконка будет у вас! Примечание: порядок очень важен ...

        final Dialog yourDialog = new Dialog(YourClass.this);
            yourDialog.requestWindowFeature(Window.FEATURE_LEFT_ICON);  //must come BEFORE setContentView
            yourDialog.setContentView(R.layout.yourDialog_layout);
            yourDialog.setTitle("Your Title");
            yourDialog.setCancelable(true);  
            yourDialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.your_icon);  //must come AFTER setContentView
person PeteH    schedule 20.11.2012

Я заставил его работать по-другому, благодаря сообщению Smaïl Hammour.

Поместите этот статический метод в предпочитаемый класс инструментов:

public static void msgBox( String msg, String title, int type, final Context c){

    int theIcon = drawable.ic_dialog_alert;

    switch(type){
    case YourToolClass.CONFIRMATION:
        theIcon = drawable.ic_menu_help;
        break;      
    case YourToolClass.INFO:
        theIcon = drawable.ic_dialog_info;
        break;
    case YourToolClass.ALERT:
    default:
    }

AlertDialog.Builder builder = new AlertDialog.Builder(c);

    /* Here enters the .setIcon: */
builder.setMessage(msg) .setTitle (title) .setIcon(theIcon);

builder.setPositiveButton( "OK", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int id) {
        /*  */
    }
}); 


AlertDialog dialog = builder.create(); 
dialog.show();

}

Вызывать:

YourToolClass.msgBox("the main message goes here", "Test", getBaseContext());
person Sergio Abreu    schedule 15.01.2013

вызов setFeatureDrawableResource, как это

 dialog.show();
 dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.logo_1x);

т.е. после вызова dialog.show () в моем случае работал отлично .. спасибо .. :)

person K Priyanka    schedule 15.09.2016