14

我正在使用 Action Bar Compat,以便我的带有导航抽屉的操作栏向后兼容到 API 级别 9,我想更改操作栏的背景。

我从Android Developers复制了代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
       parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/MyActionBar</item>

    <!-- Support library compatibility -->
    <item name="actionBarStyle">@style/MyActionBar</item>
</style>

<!-- ActionBar styles -->
<style name="MyActionBar"
       parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@drawable/actionbar_background</item>

    <!-- Support library compatibility -->
    <item name="background">@drawable/actionbar_background</item>
</style>
</resources>

问题来了。

当我将可绘制的图像或颜色作为背景时,它可以正常工作。但是我想将背景定义为渐变形状,所以我actionbar_background看起来像:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line">
<gradient
        android:startColor="@color/ac_bg_start"
        android:endColor="@color/ac_bg_end"
        android:type="linear"/>
<size
        android:width="1dp"
        android:height="48dp"/>
</shape>

我希望它以水平方式重复,但即使这样也会导致错误,事实上,非常有趣的错误。当我尝试运行应用程序时,测试设备甚至模拟器都会重新启动。我能够DeadObjectException在重新启动之前捕捉到。

背景可绘制对象应该如何?

4

4 回答 4

21

我目前正在从事相同的任务。

这是我的action_bar_bg.xml文件,我在其中定义了我的操作栏的渐变。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:angle="90"
        android:centerColor="@color/turquoise_action_bar"
        android:endColor="@color/dark_turquoise"
        android:startColor="@color/dark_turquoise" />
</shape>

死对象异常

android:shape="line"如果内部有渐变,则不能使用。我测试了它;我的三星 Galaxy Note 10.1 N8000 重新启动,出现DeadObjectException.

渐变图案的linear类型是默认值。所以你不必明确声明它。

这是我styles.xml文件夹中的。

<resources>

    <!-- Base application theme. -->
    <style name="AppThemeBase" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/PeopleCanAct</item>
        <!-- Support library compatibility -->
        <item name="actionBarStyle">@style/MyActionBar</item>
    </style>

    <style name="AppTheme" parent="AppThemeBase">
        <!-- All the customizations that are NOT specific to a particular API level can go here -->
    </style>

    <!-- ActionBar styles -->
    <style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@drawable/action_bar_bg</item>
        <!-- Support library compatibility -->
        <item name="background">@drawable/action_bar_bg</item>
    </style>

</resources>

渐变可绘制

于 2014-01-02T19:46:17.323 回答
18

另一种方法,无需修改styles.xml

这是我们的 GradientDrawable 示例res/drawable/ab_gradient.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="false" >

    <gradient
        android:angle="90"
        android:startColor="#000000"
        android:endColor="#FFFFFF"
        android:type="linear" />

</shape>

您可以将其设置为 Activity 中的操作栏onCreate()

ActionBar actionBar = getActionBar();    
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.action_bar_gradient_shape));

如果您使用支持 v7 库(您的情况):

// make sure to import android.support.v7.app.ActionBar
ActionBar actionBar = getSupportActionBar();        
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.action_bar_gradient_shape));

或者,如果您使用 ActionBarSherlock:

// make sure to import com.actionbarsherlock.app.ActionBar
ActionBar actionBar = getSherlock().getActionBar();     
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.action_bar_gradient_shape));
于 2014-03-22T10:26:55.877 回答
1

这是操作栏 xml 的示例:

<?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:angle="180"
        android:endColor="#BF797777"
        android:startColor="#A4231E35"
        android:type="linear" />
</shape> 

代替使用 android:shape="line" ,为了避免 DeadObjectException ,您可以将android:angle设置为 180 或 0 - 效果将是相同的,即水平线渐变。

于 2020-01-25T20:46:34.803 回答
0

我还使用来自 Android Developer 的示例代码,并像您一样使用渐变 XML。

<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">

我发现你和我的这个文件的不同是android:shape="line"/ android:shape="rectangle"

所以我尝试将我的矩形更改为线条。我的应用程序也发生了同样的异常,操作系统重新启动。也许形状是关键点。

于 2014-10-21T07:23:55.053 回答