Android: AlertDialog button does not accept style

I have a style configured for my Alert Dialog, and the style is displayed in the [most] dialog box without any problems, the only problem is the buttons.

The phone is the HTC Evo working with SenseUI, and the AlertDialog buttons continue to be smoothed through the SenseUI theme. I tried to change the style of my application (rtg_style) to be a child of Theme.Dialog instead of Theme.Light.NoTitleBar, and the buttons for actions continue to be styled correctly, but AlertDialogs are also still styled. I'm trying to avoid having to write a fully custom AlertDialog replacement, what else can I do?

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(); 
+4
source share
2 answers

Found the answer! From what I explored, the buttons in alertdialog use their own layout, which cannot be overridden, so I turned out to be a subclassed dialog box and created my own dialog box myself.

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(); } 

}

+6
source

What I just tried works. You can use getButton (int whichButton) to retrieve the Button View class, and then you can destroy it however you want.

Before you do this, call the .show () function, otherwise the button itself will not be created yet, and the getButton () command will give you null, and NullPointerExceptions will suck. After you get the button, you can make Button / TextView (Button is an advanced TextView), for example .setBackgroundDrawable and .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); 

If someone can figure out how to set a style / theme outside of creating a new button and scroll that button, I’m all ears because it will be better.

Rock! Rock on!

+8
source

Source: https://habr.com/ru/post/1397490/


All Articles