2

J'ai vue personnalisée qui prendra ensemble (la valeur xml) attribut comme valeur constructeurvaleurs Alter AttributeSet dans Android

public CustomView(Context context) // No Attributes in this one. 
{ 
    super(context); 
    this(context, null, 0); 
} 

public CustomView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this(context, attrs, 0) 
} 

public CustomView(Context context, AttributeSet attrs, int default_style) { 
    super(context, attrs, default_style); 
    readAttrs(context, attrs, defStyle); 
    init(); 
} 

En classe Fragment je suis en train de la vue comme

CustomView customView = (CustomView) view.findViewById(R.id.customView); 

où la coutume La vue contient diverses valeurs telles que la hauteur, la largeur, le remplissage, etc.

Je souhaite modifier ces valeurs en fonction des conditions requises et les rétablir en vue personnalisée. J'ai placé le code de hauteur de réglage dans la méthode onDraw et j'ai appelé la vue invalide. Mais la méthode ci-dessus va définir chaque fois si j'ai appelé invalider la méthode dans la classe CustomView. comment surmonter cela afin que je puisse transmettre la valeur de jeu d'attributs modifié dans le constructeur seulement.

Édition: J'ai besoin de modifier les valeurs de vue (initialiser avec de nouvelles valeurs) qui sont définies pendant le constructeur d'attribut afin que j'obtienne une vue actualisée avec de nouvelles valeurs. Remplacer @OnDraw ou 'Invalider' n'est pas une bonne fonction pour moi où invalide j'ai écrit les méthodes qui seront exécutées dans chaque intervalle de secondes.

+0

Au lieu de cela, essayez de configurer 'LayoutParams' pour vous' CustomView'. De cette façon, vous pouvez modifier ses valeurs en fonction de la condition requise. – astuter

+0

@astuter Les valeurs de CustomView ne sont pas seulement la largeur, la hauteur, etc. Les valeurs qui sont définies dans la vue telles que color, showText, ShowColor, ShowGraph. etc. –

Répondre

0

Il est sans doute pas la solution que vous espériez, mais mettre un FrameLayout dans votre xml au lieu du CustomView, puis créez votre CustomView programme avec le FrameLayout comme il est parent

+0

Merci. Mon problème est le besoin de passer des paramètres personnalisés tels que Customview.angle, customView.isIntialized comme les paramètres qui est précédemment défini dans attributeset xml .. –

0

Alors disons que vous avez déclaré vos attributs personnalisés comme celui-ci pour la vue nommée StarsView

Et vous voulez lire attrib tes de quelque chose comme ça

<my.package..StarsView 
    app:stars="5" 
    app:score="4.6" 

Vous venez de faire ce dans le constructeur

public StarsView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    if(attrs != null) { 
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.StarsView, defStyleAttr, 0); 
     stars = Tools.MathEx.clamp(1, 10, a.getInt(R.styleable.StarsView_stars, 5)); 
     score = (int)Math.floor(a.getFloat(R.styleable.StarsView_score, stars) * 2f); 
     a.recycle(); // its important to call recycle after we are done 
    } 
} 
+0

Lecture est très bien dans mon cas; Le problème est que je dois modifier la valeur en fonction de la condition et actualiser uniquement ces valeurs. Ex: J'ai dix attributs et j'ai besoin de modifier seulement deux attributs et devrait rafraîchir la vue. –

+0

Je pense que je ne comprends pas un peu, AttributeSet vous recevez en construisant la vue est juste la façon Android de vous permettre de lire les valeurs XML, et bien sûr quand je lis mes étoiles = 5, et quoi écrire dans textView 5 je voudrais juste définir cette valeur lorsque je crée set Voir – Inverce

+0

également ajouter set/get méthodes pour vos variables qui représentent ces attributs dans votre vue, de sorte que vous pouvez modifier le code trituré – Inverce

2

Je vois que votre CustomView peut avoir plusieurs attributs et que vous souhaitez modifier certains de ces attributs en fonction de certaines conditions et de transmettre cette dans le constructeur.

Peu meilleures pratiques en conception une vue personnalisée:

  1. Si vous avez des attributs personnalisés, assurez-vous que vous les exposez via setters et getters. Dans votre méthode Setter, appelez invalidate();
  2. N'essayez pas de modifier les attributs à l'intérieur des méthodes onDraw() ou onMeasure().
  3. Faites de votre mieux pour éviter d'écrire des constructeurs personnalisés pour votre vue personnalisée.

donc le moyen idéal pour résoudre votre problème est d'instancier votre CustomView puis modifier les attributs, que ce soit à l'extérieur (dans votre activité ou Fragment), ou une méthode dans la CustomView.java puis invoquer à l'extérieur. Faire cela vous donnera toujours le même résultat que vous recherchez.

+0

Merci. C'est ce que je cherche. J'ai besoin de modifier les valeurs des attributs personnalisés pour que je puisse invalider mes vues. –

+0

Je suggère que vous ayez une méthode dans le CustomView qui effectue la vérification conditionnelle que vous voulez (si elle est générique), et sur la base de cela, modifiez votre attributs via les méthodes setter pour vos attributs. J'espère que cela t'aides. – Henry