2010-10-26 6 views
1

J'utilise la forme d'attribut comme ceci:Comment changer la couleur de TextView à l'exécution avec l'attribut de forme sur Android?

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" 
    android:padding="10dp"> 
<solid 
    android:color="#FFFFFF" /> 
<corners 
    android:bottomRightRadius="15dp" 
    android:bottomLeftRadius="15dp" 
    android:topLeftRadius="15dp" 
    android:topRightRadius="15dp" /> 
</shape> 

et

 <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/rounded_textview"> 
     </TextView> 

Si je change la couleur lors de l'exécution avec la méthode suivante:

TextView.setBackgroundColor(); 

La forme est je disparaître. Que dois-je faire pour le changer de la bonne façon? Ou devrais-je devoir générer beaucoup de formes pour différentes couleurs?

Merci.

+0

Je ne vois pas quelle est la connexion entre la forme et le TextView. Aussi, je suis sûr que vous ne pouvez pas appeler 'setBackgroundColor' comme ça sans arguments. Quel argument passez-vous à cette fonction? – MatrixFrog

+0

La forme est définie comme étant l'arrière-plan de TextView dans le fichier XML. Et je passe un argument de couleur qui fonctionne. – shiami

Répondre

1

J'ai trouvé une solution avec PaintDrawable qui contient les attributs de couleur et de rayon. Mais Il doit définir la couleur dans le contructor. Je dois donc à chaque fois créer un PaintDrawable à l'exécution et le définir sur l'arrière-plan d'un TextView.

public static PaintDrawable getRoundedColorDrawable(int color, float radius, int padding) { 
    PaintDrawable paintDrawable = new PaintDrawable(color); 
    paintDrawable.setCornerRadius(radius); 
    paintDrawable.setPadding(padding, padding, padding, padding); 
    return paintDrawable; 
} 
0

Vous devez définir l'arrière-plan d'une forme différente avec l'élément Solide correct. Je crois setBackgroundColor est juste une coupe courte à quelque chose comme:

void setBackgroundColor(int color){ 
ColorDrawable drawable = new ColorDrawable(color); 
setBackgroundDrawable(drawable); 
} 

Alors oui, vous aurez besoin de quelques formes :)

+0

Oui, mais je cherche une solution alternative qui ne doit pas redéfinir la forme car je dois changer de couleur. Mais ça va être beaucoup de fichiers XML. Ou s'il suffit de définir l'arrière-plan avec un ColorDrawable comme code, l'attribut corner est parti. – shiami

+0

Peut-être que je peux obtenir l'original drawable et juste changer sa couleur. Mais je ne vois pas de méthode comme setColor(). – shiami

+0

Vous pourriez être en mesure de saisir le ShapeDrawable, en saisissant la peinture, via getPaint() et en définissant la couleur de la peinture via setPaint(). –

0

J'ai eu le même problème

Vous pouvez utiliser cette méthode

TextView tv = // ... //; 
tv.setBackgroundResource(R.drawable.myshape); 

Il fonctionne bien pour moi!

Questions connexes