Android: кнопка AlertDialog не принимает стиль

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

Телефон HTC Evo работает под управлением SenseUI, а кнопки AlertDialog продолжают сглаживаться через тему SenseUI. Я попытался изменить стиль моего приложения (rtg_style), чтобы быть дочерним элементом Theme.Dialog вместо Theme.Light.NoTitleBar, а кнопки для действий продолжают корректно оформляться, но AlertDialogs также по-прежнему оформляются в стиле. Я пытаюсь избежать необходимости писать полностью пользовательскую замену 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(); 

Что-то, что я только что пробовал, работает. Вы можете использовать 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); 

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

Рок! Раскачать!

Нашел ответ! Из того, что я исследовал, кнопки на alertdialog используют свой собственный макет, который нельзя переопределить, поэтому я закончил подкласс 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(); } 

}

Intereting Posts
Прозрачная строка состояния, не работающая с windowTranslucentNavigation = "false" Долгое нажатие на выделенный текст в текстовом режиме в android Java.net.SocketException: разрешение запрещено для android Использование обеих камер на Android: «Не удалось подключиться к службе камеры» OnActivityResult не вызывается на одном устройстве Android, но находится на другом Retrofit 2 не отправляет данные, когда включен ProGuard Вертикальная прокрутка текстовой строки в Android Как я могу изменить стиль кнопки динамически в Android? Что именно происходит, когда вы удаляете задачу из ретентатов? Порт iPhone (OpenGL / C ++) для Android Индивидуальные схемы URL-адресов iOS по сравнению со стандартами Universal Links и Android Как показать маркеры все время с помощью AsyncTask или Handler в google map version 2 MPAndroidChart LineChart настраивает выделение выделения Поиск Android ViewFlipper Пример с несколькими WebViews Android Keystore getEntry () и generateKeyPair () throw Исключения иногда