我正在使用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
。
背景素材应如何显示?
答案 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>
答案 1 :(得分:16)
另一种方法,无需修改styles.xml
:
以下是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>
您可以在活动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"
。
所以我尝试将矩形更改为直线。我的应用程序也出现相同的异常,并重新启动操作系统。也许形状是关键点。