如何使style =“?attr / actionButtonStyle”适用于矩形工具栏按钮

时间:2016-04-23 07:46:16

标签: android

在我们之前设计的全息设计应用(targetSdkVersion 21,主题为Theme.Sherlock.Light.DarkActionBar)中,我们使用系统样式属性 attr/actionButtonStyle 来定义自定义操作栏按钮样式。

actionbar_custom_view_done_discard.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <include layout="@layout/actionbar_discard_button" />
    <View
        android:layout_width="1px"
        android:layout_height="match_parent"
        android:layout_marginTop="12dp"
        android:layout_marginBottom="12dp"
        android:background="?attr/actionBarCustomViewDividerColor" />    
    <include layout="@layout/actionbar_done_button" />
</LinearLayout>

actionbar_done_button.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="?attr/actionButtonStyle"
    android:id="@+id/actionbar_done"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1">

    <TextView style="?attr/actionBarTabTextStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:paddingRight="20dp"
        android:drawableLeft="?attr/actionBarDoneIcon"
        android:drawablePadding="8dp"
        android:gravity="center_vertical"
        android:text="@string/save" />
</FrameLayout>

StockAlertFragmentActivity.java

public class StockAlertFragmentActivity extends SherlockFragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Inflate a "Done/Discard" custom action bar view.
        LayoutInflater inflater = (LayoutInflater) this.getSupportActionBar().getThemedContext()
                .getSystemService(LAYOUT_INFLATER_SERVICE);
        final View customActionBarView = inflater.inflate(
                R.layout.actionbar_custom_view_done_discard, null);

当我们点击保存按钮时,结果如下。

enter image description here

但是,在将我们的应用迁移到素材设计的应用(targetSdkVersion 23,主题Theme.AppCompat.Light.NoActionBar)后,系统属性 attr/actionButtonStyle 不再适用于矩形按钮

相反,它在矩形按钮的顶部绘制一个圆形覆盖。

toolbar_with_save_discard.xml

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:elevation="4dp"
    android:contentInsetLeft="0dp"
    android:contentInsetStart="0dp"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    android:contentInsetRight="0dp"
    android:contentInsetEnd="0dp"
    app:contentInsetRight="0dp"
    app:contentInsetEnd="0dp"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" >

    <!-- android:elevation="4dp" is used due to http://www.google.com/design/spec/what-is-material/elevation-shadows.html#elevation-shadows-elevation-android- -->

    <LinearLayout
        android:id="@+id/buttons_linear_layout"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:orientation="horizontal">
        <include layout="@layout/toolbar_discard_button" />
        <View
            android:layout_width="1px"
            android:layout_height="match_parent"
            android:layout_marginTop="12dp"
            android:layout_marginBottom="12dp"
            android:background="?attr/toolbarCustomViewDividerColor" />
        <include layout="@layout/toolbar_save_button" />
    </LinearLayout>

</android.support.v7.widget.Toolbar>

toolbar_save_button.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="?attr/actionButtonStyle"
    android:id="@+id/toolbar_save"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1">

    <TextView style="?attr/actionBarTabTextStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:paddingRight="20dp"
        android:drawableLeft="?attr/toolbarDoneIcon"
        android:drawablePadding="8dp"
        android:gravity="center_vertical"
        android:text="@string/save" />
</FrameLayout>

enter image description here

我喜欢在整个矩形保存按钮上绘制叠加层。

我想我很可能通过避免使用style="?attr/actionButtonStyle"并提供我自己定义的选择器来解决这个问题。

但是,我不想这样做。我更喜欢使用系统提供的样式,以减少维护问题。

如何使style="?attr/actionButtonStyle"适用于矩形工具栏按钮?

或者,是否还有其他系统样式属性,它可以与矩形工具栏按钮一起使用?同时,产生连锁反应。

1 个答案:

答案 0 :(得分:1)

此处的属性是:actionButtonStyle,您在包装FrameLayout上设置。在第23节,它指向:

<style name="Widget.Material.ActionButton">
    <item name="background">?attr/actionBarItemBackground</item>
    <item name="paddingStart">12dp</item>
    <item name="paddingEnd">12dp</item>
    <item name="minWidth">@dimen/action_button_min_width_material</item>
    <item name="minHeight">@dimen/action_button_min_height_material</item>
    <item name="gravity">center</item>
    <item name="scaleType">center</item>
    <item name="maxLines">2</item>
</style> 

background设置为actionBarItemBackground,而RippleDrawable又指向此<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?attr/colorControlHighlight" android:radius="20dp" />

actionBarItemBackground

半径值是您不想要的。

要解决此问题,请在应用主题下覆盖<style name="AppTheme" parent="...."> .... <item name="actionBarItemBackground">@drawable/custom_action_bar_item_bg</item> <item name="android:actionBarItemBackground">@drawable/custom_action_bar_item_bg</item> </style>

custom_action_bar_item_bg

drawable <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <color android:color="#...."/> </item> <item> <color android:color="@android:color/transparent"/> </item> </selector> 定义为:

RES /抽拉/ custom_action_bar_item_bg.xml

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?attr/colorControlHighlight">
    <item android:id="@id/mask">
        <color android:color="@android:color/white" />
    </item>
</ripple>

RES /抽拉-V21 / custom_action_bar_item_bg.xml

mask

actionBarItemBackground会在API版本&gt;的情况下为您提供矩形21。

缺点:使用FrameLayout的所有项目都会受到影响(除非这样可以)。要解决此问题,您可以创建一个单独的主题,以便在<style name="AppTheme" parent="...."> .... .... </style> 包装器上进行设置。例如,这是您应用的主题:

AppTheme

创建另一个继承自<style name="SelectiveActionBarButtonTheme" parent="AppTheme"> <item name="actionBarItemBackground">@drawable/custom_action_bar_item_bg</item> <item name="android:actionBarItemBackground">@drawable/custom_action_bar_item_bg</item> </style> 的主题:

android:theme

要使用此功能,请覆盖包装器FrameLayout上的<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" style="?attr/actionButtonStyle" android:id="@+id/toolbar_save" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:theme="@style/SelectiveActionBarButtonTheme"> .... .... </FrameLayout>

FrameLayout's

当然,最简单的方法是将android:background ?attr/selectableItemBackground设置为[Instance: i-dc5e265b] Command failed on instance. Return code: 1 Output: (TRUNCATED)...s/lib/less/import-visitor.js:34:22) at Parser.parser.parse (/opt/rubies/ruby-2.1.8/lib/ruby/gems/2.1.0/gems/less-2.6.0/lib/less/js/lib/less/parser.js:675:22) Unrecognised input Tasks: TOP => assets:precompile (See full trace by running task with --trace). Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/11_asset_compilation.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI. ,然后完成。