AndroidX MaterialButton不显示样式

问题描述 投票:0回答:1

我有一个LinearLayout,可以在其中以编程方式放置按钮。一开始,内部有一个按钮,用于添加新的过滤器按钮。 XML如下:

        <LinearLayout
            android:id="@+id/filterContainer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:clipToPadding="false"
            android:orientation="horizontal">

            <com.google.android.material.button.MaterialButton
                android:id="@+id/addFilterButton"
                style="@style/iconButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:icon="@drawable/ic_filter_list_icon_color" />
        </LinearLayout>

如果按下过滤器按钮,则可以添加新的过滤器。像这样将其中的LinearLayout添加到ViewGroup:

private void addButtonForFilter(ResultFilter filter) {
    MaterialButton newFilter = new MaterialButton(mFilterBoxViewGroup.getContext(),
            null, R.attr.materialButtonStyle);
     newFilter.setText(FilterStringProvider.getLabel(mFilterBoxViewGroup.getContext(), filter));
    newFilter.setLayoutParams(mParameters);
    newFilter.setOnClickListener(this);
    newFilter.setTag(filter.getFilterType());
    mFilterBoxViewGroup.addView(newFilter);
}

这里按钮显示在标准材料设计中。现在,我想将其更改为特定样式。

<style name="textButton" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="backgroundTint">@color/colorActionbarTabs</item>
    <item name="android:textColor">@color/itemColor</item>
    <item name="android:textSize">@dimen/item_standard_text_size</item>
    <item name="android:clipToPadding">false</item>
</style>

如果我更改了上面代码的构造函数中的样式,则该按钮未按预期显示:

    MaterialButton newFilter = new MaterialButton(mFilterBoxViewGroup.getContext(),
            null, R.style.textButton);

即使新样式将MaterialButton作为父级,按钮现在也没有填充显示,而我无法找出导致此现象的原因。有任何想法吗?

android material-design android-styles androidx material-components-android
1个回答
0
投票

MaterialButton的构造函数是:

MaterialButton(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr)

3rd参数是defStyleAttr,它是您的app主题中定义的属性,它是not样式。

例如R.attr.materialButtonStyle

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
   <item name="materialButtonStyle">@style/Widget.MaterialComponents.Button</item>
</style>

[使用1.1.01.2.0-beta01定义了三个内置属性:

<item name="materialButtonStyle">@style/Widget.MaterialComponents.Button</item>
<item name="materialButtonOutlinedStyle">@style/Widget.MaterialComponents.Button.OutlinedButton</item>
<item name="borderlessButtonStyle">@style/Widget.MaterialComponents.Button.TextButton</item>

1.3.0-alpha01引入了新的属性:

<item name="buttonBarButtonStyle">@style/Widget.MaterialComponents.Button.TextButton</item>

您可以在应用程序主题中使用这些属性之一来覆盖它们:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
   <item name="buttonBarButtonStyle">@style/textButton</item>
</style>

然后使用:

MaterialButton newFilter = new MaterialButton(mFilterBoxViewGroup.getContext(),
            null, R.attr.buttonBarButtonStyle);
© www.soinside.com 2019 - 2024. All rights reserved.