web-dev-qa-db-ja.com

ActionBar 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をキャッチできました。

背景のドローアブルはどのように見えるべきですか?

11
Marcel Bro

私は現在同じタスクに取り組んでいます。

これが私の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"内部にグラデーションがある場合は使用できません。私はそれをテストしました。 Samsung Galaxy Note 10.1 N8000が再起動し、DeadObjectExceptionがありました。

グラデーションパターンのlinearタイプは、default値です。したがって、明示的に宣言する必要はありません。

これが私のstyles.xmlvaluesフォルダー内。

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

グラデーション描画可能

19
Maksim Dmitriev

_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));
_
17
Max77

これは、アクションバー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に設定できます。効果は同じ、つまり水平線のグラデーションになります。

0
JJ McKool

また、Android Developerのサンプルコードを使用し、グラデーションXMLを同じように使用します。

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

このファイルのあなたと私のファイルの違いはAndroid:shape="line"/Android:shape="rectangle"

だから私は長方形を線に変えようとしています。私のアプリでも同じ例外が発生し、OSが再起動します。形がポイントかもしれません。

0
OsterHuang