web-dev-qa-db-fra.com

Comment définir par programme le dégradé de couleur d'arrière-plan sur une barre de titre personnalisée?

Il existe de nombreux didacticiels et des questions sur SO qui implémentent des barres de titre personnalisées. Cependant, dans ma barre de titre personnalisée, j'ai un dégradé personnalisé pour l'arrière-plan et je voudrais savoir comment le définir dynamiquement dans mon code.

Voici où ma barre de titre personnalisée est appelée:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.foo_layout);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar); 

Et c'est mon custom_title_bar:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="horizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="@layout/custom_title_bar_background_colors">
<ImageView   
              Android:layout_width="fill_parent"
              Android:layout_height="wrap_content"
              Android:src="@drawable/title_bar_logo"
              Android:gravity="center_horizontal"
              Android:paddingTop="0dip"/>

</LinearLayout>

Comme vous pouvez le voir, l'arrière-plan de la disposition linéaire est défini par ce type:

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<gradient 
    Android:startColor="#616261" 
    Android:endColor="#131313"
    Android:angle="270"
 />
<corners Android:radius="0dp" />
</shape>

Ce que je voudrais faire, c'est définir ces couleurs dégradées dynamiquement dans mon code. Je ne veux pas les coder en dur dans mon fichier XML comme ils le sont actuellement.

Je suis ouvert à toutes les idées si vous avez une meilleure façon de définir un dégradé de fond.

Merci d'avance!!

63
AngeloS

Pour ce faire dans le code, vous créez un GradientDrawable.
La seule chance de régler l'angle et la couleur est dans le constructeur. Si vous souhaitez modifier la couleur ou l'angle, créez simplement un nouveau GradientDrawable et définissez-le comme arrière-plan

    View layout = findViewById(R.id.mainlayout);

    GradientDrawable Gd = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM,
            new int[] {0xFF616261,0xFF131313});
    Gd.setCornerRadius(0f);

    layout.setBackgroundDrawable(Gd);

Pour que cela fonctionne, j'ai ajouté un identifiant à votre LinearLayout principal comme suit

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/mainlayout"
    Android:orientation="horizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">
<ImageView   
              Android:layout_width="fill_parent"
              Android:layout_height="wrap_content"
              Android:src="@drawable/title_bar_logo"
              Android:gravity="center_horizontal"
              Android:paddingTop="0dip"/>

</LinearLayout>

Et pour l'utiliser comme pour une barre de titre personnalisée

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title_bar);
    View title = getWindow().findViewById(R.id.mainlayout);
    title.setBackgroundDrawable(Gd);
166
slund