2015-09-03 2 views
4

Как, в общем, вы обнаружите, какой атрибут темы переопределить, чтобы изменить внешний вид любого элемента пользовательского интерфейса?Есть ли общий способ поиска стилей, применимых к представлению?

В настоящее время я полагаюсь на траление через исходные файлы фреймов: определения тем в values.xml (как правило, вариант библиотеки поддержки), определения атрибутов в attrs.xml и документы класса R.styleable.

Но это полностью поражает. Это не только чрезмерно много времени, но иногда я скучаю полностью, например, я безуспешно пытался узнать, как изменить стили текста в кнопках «Да» и «Отмена» DatePickerDialog. Не стесняйтесь использовать это в качестве примера, но если вы это сделаете, опишите свой процесс обнаружения. Ответ, который я ищу, - , как открыть прикладные стили для любого элемента пользовательского интерфейса,

Или нет только детерминированного способа узнать? Вы просто должны знать?

+0

Я ответил на этот точный вопрос здесь: [Как изучить стиль в 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

+0

@ Викрам, это невероятно полезно, спасибо. Quelle horreur, хотя;) – Cris

+0

Да, 'Как исследовать стиль в android', хотя apt, не очень дружественный к поисковой системе, я полагаю. Рад, что вы сочли это полезным. – Vikram

ответ

3

Поиск способов изменения стилей для виджетов на 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); 
} 

enter image description here


Вывод:

Вы можете использовать указанные выше методы на других чтобы найти стиль, который применяется для этой точки зрения. Это все еще боль в стиле ** для стилей виджета на Android. Возможно, вам придется время от времени копировать исходный код и XML.

+1

Это очень полезно, и я узнал от него несколько полезных вещей. Он не * полностью * отвечает на мою главную проблему, а именно, как найти атрибуты, которые относятся к данному виду. Я отмечаю, что, включив 'android.R.attr.datePickerStyle' в код, вы полагаетесь на то, что уже знаете, но проблема для меня - это то, откуда это знание. Ответ Викрама, упомянутый в его комментарии, в значительной степени охватывает то, что мне нужно знать. Щедрость послужила для меня своей целью, поэтому я награжу его, даже не приняв вашего ответа. – Cris

+0

@Cris Я рад, что ответ был полезен. Я не думаю, что можно найти, какие атрибуты имеют представления, если вы не прокопаете исходный код. Если я найду лучший подход, я обновлю свой ответ. Благодарю. –

Смежные вопросы