ActionBar Compat的自定义(渐变)背景

时间:2013-08-26 08:37:39

标签: android background android-actionbar-compat shapedrawable

我正在使用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 个答案:

答案 0 :(得分:16)

我目前正在完成同样的任务。

这是我的 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>

<强> DeadObjectException

如果内部存在渐变,则无法使用

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>

Gradient Drawable

答案 1 :(得分:16)

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

以下是res/drawable/ab_gradient.xml

中的示例GradientDrawable
<?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>

您可以在活动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));

答案 2 :(得分: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> 

为了避免DeadObjectException,而不是使用android:shape =“ line”,可以将 android:angle 设置为180或0-效果将相同,即水平线渐变。

答案 3 :(得分:0)

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

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

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

所以我尝试将矩形更改为直线。我的应用程序也出现相同的异常,并重新启动操作系统。也许形状是关键点。