Android: кнопка AlertDialog не поддерживает стиль - PullRequest
4 голосов
/ 20 февраля 2012

У меня настроен стиль для моего Alert Dialog, и стиль отображается в [большинстве] диалогов без проблем, единственная проблема - кнопки.

Телефон HTCВ Evo запущен SenseUI, а кнопки AlertDialog продолжают обрабатываться с помощью темы SenseUI.Я попытался изменить свой стиль приложения (rtg_style), чтобы он был дочерним по отношению к Theme.Dialog вместо Theme.Light.NoTitleBar, и кнопки для действий продолжают стилизоваться правильно, но стили AlertDialog также продолжают неправильно стилизоваться.Я пытаюсь избежать написания полностью пользовательской замены AlertDialog, что еще я могу сделать?

styles.xml:

<style name="rtg_style" parent="@android:style/Theme.Light.NoTitleBar">
    <item name="android:windowBackground">@drawable/bluebg</item>
    <item name="android:buttonStyle">@style/rtg_Button</item>
    <item name="android:listViewStyle">@style/rtg_ListView</item>
    <item name="android:expandableListViewStyle">@style/rtg_ExpandableListView</item>
</style>

<style name="rtg_AlertDialog" parent="@style/rtg_style"> <!-- parent="@android:style/Theme.Dialog"> --> 
    <item name="android:buttonStyle">@style/rtg_Button</item>
    <item name="android:listViewStyle">@style/rtg_ListView</item>
    <item name="android:alertDialogStyle">@style/dialog</item>
</style>

<style name="rtg_Button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/button</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:textSize">15sp</item>
    <item name="android:textStyle">bold</item>
    <item name="android:height">40dp</item>
</style>

<style name="rtg_ListView" parent="@android:style/Widget.ListView">
    <item name="android:listSelector">@drawable/listview</item>
</style>

<style name="rtg_ExpandableListView" parent="@android:style/Widget.ExpandableListView">
    <item name="android:listSelector">@drawable/listview</item>
</style>    

<style name="base">
    <item name="android:padding">10dp</item>
</style>    

<style name="title" parent="@style/base">
      <item name="android:textColor">#FFFFFF</item>
    <item name="android:textSize">16sp</item>
    <item name="android:textStyle">bold</item>
</style>

<style name="body" parent="@style/base">
    <item name="android:textColor">#000000</item>
    <item name="android:textStyle">normal</item>
</style>

<style name="dialog">
    <item name="android:fullDark">@drawable/dialog_body</item>
    <item name="android:topDark">@drawable/dialog_title</item>
    <item name="android:centerDark">@drawable/dialog_body</item>
    <item name="android:bottomDark">@drawable/dialog_footer</item>
    <item name="android:fullBright">@drawable/dialog_body</item>
    <item name="android:centerBright">@drawable/dialog_body</item>
    <item name="android:bottomBright">@drawable/dialog_footer</item>
    <item name="android:bottomMedium">@drawable/dialog_footer</item>
    <item name="android:centerMedium">@drawable/dialog_body</item>
    <item name="android:windowIsFloating">true</item>

</style>

Activity.java:

AlertDialog.Builder ab = new AlertDialog.Builder(new ContextThemeWrapper(OrderSummary.this, R.style.rtg_AlertDialog));
            ab.setTitle("Select a reason");
            String[] reasons = new String[Shared.Reasons_RejectAll.size()];
            for (int i = 0; i < Shared.Reasons_RejectAll.size(); i++) { 
                try {
                    reasons[i] = Shared.Reasons_RejectAll.get(i).Name;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            ab.setItems(reasons, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    rejectReason = Shared.Reasons_RejectAll.get(which).Name;
                    for (int i = 0; i <= r.ItemList.length; i++){
                        r.ItemList[index].item.get(i).setStatus(eItemStatus.REJECTED);
                        r.ItemList[index].item.get(i).setRejectReason(rejectReason);
                    }
                    adapter.notifyDataSetChanged();
                }
            }) 
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // No additional code required at this time.
                }
            });
            //ab.show();

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

Ответы [ 2 ]

8 голосов
/ 14 сентября 2012

Что-то, что я только что попробовал, работает.Вы можете использовать getButton (int whichButton) для того, чтобы извлечь класс View для Button, а затем вы можете разделить его на свое усмотрение.

Перед тем, как сделать это, вызовите функцию .show (), иначе сами кнопки еще не будут созданы, а команда getButton () даст вам значение null, а NullPointerExceptions - отстой.После того, как вы получили кнопку, вы можете выполнять функции Button / TextView (Button - это расширенный TextView), такие как .setBackgroundDrawable и .setTextColor.

AlertDialog alert = new AlertDialog.Builder(activity).create();
// configure things here like the title and message
alert.show();

Button button = alert.getButton(AlertDialog.BUTTON_NEGATIVE);
button.setBackgroundResource(R.drawable.negative_button_selector);

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

Рок!Rock On!

6 голосов
/ 24 февраля 2012

Нашел ответ!Из того, что я исследовал, кнопки на alerttdialog используют свою собственную раскладку, которая не может быть переопределена, поэтому я закончил создание подкласса Dialog и построил собственный диалог самостоятельно.

CustomDialog.java:

public class CustomDialog extends Dialog implements OnClickListener {
TextView tvTitle;
TextView tvMessage;
Button btnOK;
ListView listView;
Context context;
ProgressBar prgWait;
ProgressBar prgBar;

public CustomDialog(Context context) {
    super(context, R.style.rtg_DialogActivity);
    setContentView(R.layout.dialog);
    this.context = context;

    // replace the background dim with a background blur effect
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.dimAmount = 0.0f;
    getWindow().setAttributes(lp);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

    tvTitle = (TextView) findViewById(R.id.tvDialogTitle);
    tvMessage = (TextView) findViewById(R.id.tvDialogMessage);
    btnOK = (Button) findViewById(R.id.btnDialog);
    listView = (ListView) findViewById(R.id.lvDialogList);
    prgWait = (ProgressBar) findViewById(R.id.prgDialog);
    prgBar = (ProgressBar) findViewById(R.id.prgDialogBar);
}

public CustomDialog setTitle(String text) {
    tvTitle.setText(text);      
    return this;
}

public CustomDialog setMessage(String text) {
    tvMessage.setVisibility(View.VISIBLE);
    tvMessage.setText(text);        
    return this;
}

public CustomDialog setList(List<String> list, OnItemClickListener l) {
    ArrayAdapter<String> aa = new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, list);
    listView.setVisibility(View.VISIBLE);
    listView.setAdapter(aa);
    listView.setOnItemClickListener(l);         
    return this;
}

public CustomDialog setList(String[] list, OnItemClickListener l) {
    List<String> lString = new ArrayList<String>();
    for (String s : list)
        lString.add(s);     
    return setList(lString, l);
}

public CustomDialog setButton(String text, View.OnClickListener l) {
    btnOK.setText(text);
    btnOK.setOnClickListener(l);
    return this;
}

public CustomDialog setButton(String text) {
    return setButton(text, this);
}

public CustomDialog isIndeterminate(boolean b) {
    if (b) {
        prgWait.setVisibility(View.VISIBLE);
        btnOK.setVisibility(View.GONE);
    } else {
        prgWait.setVisibility(View.GONE);
        btnOK.setVisibility(View.VISIBLE);
    }
    return this;
}

public CustomDialog isProgress(boolean b) {
    if (b) {
        prgBar.setVisibility(View.VISIBLE);
        btnOK.setVisibility(View.GONE);
    } else {
        prgBar.setVisibility(View.GONE);
        btnOK.setVisibility(View.VISIBLE);
    }
    return this;
}

public CustomDialog setProgressMax(int max) {
    prgBar.setMax(max);
    return this;
}

public CustomDialog setProgress(int progress) {
    prgBar.setProgress(progress);
    return this;
}

public int getProgressMax() {
    return prgBar.getMax();
}

public int getProgress() {
    return prgBar.getProgress();
}

@Override
public void onClick(View v) {
    this.dismiss();
}

}

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