gpt4 book ai didi

android - 如何使样式 ="?attr/actionButtonStyle"可用于矩形工具栏按钮

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:26 25 4
gpt4 key购买 nike

在我们之前的全息设计应用程序(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

但是,在将我们的应用程序迁移到 Material Designed 应用程序(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

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

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

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


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

或者,是否有任何其他系统样式属性可以很好地与矩形工具栏按钮配合使用?同时,具有链式 react 。


最佳答案

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

<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>

drawable custom_action_bar_item_bg 将定义为:

res/drawable/custom_action_bar_item_bg.xml

<?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/drawable-v21/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>

在 API 版本 > 21 的情况下,mask 会为您提供矩形。


缺点:所有使用 actionBarItemBackground 的项目都会受到影响(除非可以)。要解决此问题,您可以创建一个单独的主题以在您的 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>

要使用它,请在包装器 FrameLayout 上覆盖 android:theme:

<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 的 android:background 设置为 ?attr/selectableItemBackground,并完成它.

关于android - 如何使样式 ="?attr/actionButtonStyle"可用于矩形工具栏按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36808114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com