Поиск способов изменения стилей для виджетов на Android всегда был неприятным. Например, DatePickerDialog
имеет разные стили для дизайна Holo и Material. Таким образом, стиль диалога может зависеть от значения SDK или если вы используете библиотеку AppCompat. Существует также небольшая документация.
Было бы неплохо, если бы инструменты, такие как Hierarchy Viewer, отображали атрибуты и текущую тему виджета. Однако я не сталкивался с таким инструментом.
Мы можем получить текущую тему и атрибуты после создания представления. Вот несколько методов, которые я написал и испытанные на DatePickerDialog
найти стиль используется:
Получить текущую тему из контекста:
static String getThemeNameFromContext(Context context) {
Resources.Theme theme = context.getTheme();
String themeName;
try {
Field field = theme.getClass().getDeclaredField("mThemeResId");
if (!field.isAccessible()) {
field.setAccessible(true);
}
int themeResId = field.getInt(theme);
themeName = context.getResources().getResourceEntryName(themeResId);
} catch (Exception e) {
// If we are here then the context is most likely the application context.
// The theme for an application context is always "Theme.DeviceDefault"
themeName = "Theme.DeviceDefault";
}
return themeName;
}
Получить имя/значение атрибут:
static String getResourceName(Context context, int attribute) {
TypedArray typedArray = context.obtainStyledAttributes(new int[]{attribute});
try {
int resourceId = typedArray.getResourceId(0, 0);
return context.getResources().getResourceEntryName(resourceId);
} finally {
typedArray.recycle();
}
}
В приведенном ниже примере я создал DatePickerDialog
и получил значение темы и атрибутов, используемый в диалоге и положительна кнопка для диалога с использованием вышеуказанных методов:
// Create the DatePickerDialog
DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
}
}, 2015, Calendar.SEPTEMBER, 9);
// Show the dialog
datePickerDialog.show();
// Get the positive button from the dialog:
Button positiveButton = datePickerDialog.getButton(DatePickerDialog.BUTTON_POSITIVE);
// Get the theme used by this dialog
String theme = getThemeNameFromContext(datePickerDialog.getContext());
// Get the date picker style used by the dialog
String datePickerStyle = getResourceName(datePickerDialog.getContext(), android.R.attr.datePickerStyle);
// Get the style of the positive button:
String buttonStyle = getResourceName(positiveButton.getContext(), android.R.attr.buttonStyle);
Log.i("LOGTAG", "Theme: " + theme);
Log.i("LOGTAG", "datePickerStyle: " + positiveButton);
Log.i("LOGTAG", "buttonStyle: " + buttonStyle);
В моем тестовом проекте я получил эти значения для theme , datePickerStyle и buttonStyle:
тема: ThemeOverlay.Material.Dialog
datePickerStyle: Widget.Material.Light.DatePicker
ButtonStyle: Widget.Material.Light.Button
Это несколько полезно, но мы до сих пор не изменили положительный и отрицательный стиль кнопки. Если мы посмотрим на source for DatePickerDialog
, мы увидим, что он расширяет AlertDialog
.Это усложняет работу, так как вам нужно будет установить собственный стиль в своей теме, который повлияет на все кнопки AlertDialog
. Если вам нужен пример о том, как изменить buttonStyle
, оставьте комментарий.
Лучшим подходом было бы создать положительные и отрицательные кнопки после того, как диалог будет виден. Например, в вашем DialogFragment
вы можете поместить следующий код в onStart()
стилизовать кнопки:
@Override
public void onStart() {
super.onStart();
DatePickerDialog dialog = (DatePickerDialog) getDialog();
Button btnPos = dialog.getButton(DatePickerDialog.BUTTON_POSITIVE);
Button btnNeg = dialog.getButton(DatePickerDialog.BUTTON_NEGATIVE);
/* customize the buttons here */
btnPos.setText("CUSTOM");
btnPos.setTextAppearance(android.R.style.TextAppearance_Large);
btnNeg.setTextColor(Color.RED);
}
Вывод:
Вы можете использовать указанные выше методы на других чтобы найти стиль, который применяется для этой точки зрения. Это все еще боль в стиле ** для стилей виджета на Android. Возможно, вам придется время от времени копировать исходный код и XML.
Я ответил на этот точный вопрос здесь: [Как изучить стиль в android] (http://stackoverflow.com/questions/28523707/how-to-explore-styling-in-android). Использование этой информации со следующим ответом должно решить вашу проблему: [Изменить цвет диалогового окна Datepicker для Android 5.0] (http://stackoverflow.com/questions/28738089/change-datepicker-dialog-color-for-android-5-0) , – Vikram
@ Викрам, это невероятно полезно, спасибо. Quelle horreur, хотя;) – Cris
Да, 'Как исследовать стиль в android', хотя apt, не очень дружественный к поисковой системе, я полагаю. Рад, что вы сочли это полезным. – Vikram