Ошибка применения стиля изображения динамически, почему? - PullRequest
0 голосов
/ 03 октября 2011

attrs.xml:

<declare-styleable name="AppTheme">
    <attr name="actionbarCompatLogoStyle" format="reference" />
</declare-styleable>

styles.xml:

<style name="Theme.MyApp" parent="android:style/Theme.Light">
    <item name="actionbarCompatLogoStyle">@style/ActionBarCompatLogo</item>
</style>

<style name="ActionBarCompatLogo">
    <item name="android:layout_width">30dp</item><!-- original image is huge -->
    <item name="android:layout_height">30dp</item>
    <item name="android:src">@drawable/app_logo</item>
</style>

Проблема: если я использую это, размеры изображения не будут работать (огромное изображение):

ImageButton logo = new ImageButton(context, null, R.attr.actionbarCompatLogoStyle);

Если я использую это, это работает (крошечное изображение, которое я и хочу):

<ImageView style="@style/ActionBarCompatLogo"></ImageView>

Почему?

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Любой атрибут с префиксом layout_ является частью объекта LayoutParams. LayoutParams - это особые аргументы родительского представления о том, как оно должно планировать дочернее представление. Тип LayoutParams, который вы устанавливаете в представлении, зависит от того, к какому типу ViewGroup вы добавляете его. Каждый тип представления контейнера может быть различным, как и LayoutParams. layout_weight относится к LinearLayout, layout_below для RelativeLayout и т. Д. layout_width и layout_height являются частью базовой ViewGroup LayoutParams.

Вывод из этого заключается в том, что LayoutParams не анализируются конструктором представления, они анализируются еще одним шагом, который не выполняется вашим кодом выше. (В LayoutInflater используется метод родительской ViewGroup generateLayoutParams.)

Поскольку LayoutParams зависят от предполагаемого родителя представления, не рекомендуется помещать LayoutParams в стили. Он в основном работает, когда вы надувает представления из макета XML, но имеет другие последствия, подобные крайнему случаю, который вы нашли здесь, и требует, чтобы вы знали о них. Например, стиль может указывать layout_weight для LinearLayout, но если вместо этого представление с этим стилем добавляется в RelativeLayout, оно не будет вести себя так, как ожидается, поскольку RelativeLayout не поддерживает layout_weight.

0 голосов
/ 03 октября 2011

Насколько я знаю, невозможно применять стили к определенным представлениям программно, только через XML.

Что вы можете сделать, это установить тему своей деятельности в методе onCreate().Обратитесь к этому вопросу: Android динамически меняет стиль во время выполнения

...