0

C'est ma première question.La visionneuse hiérarchique fait apparaître les changements de hauteur

j'ai construit un composant personnalisé: un RelativeLayout avec un TextView sur le fond et deux ImageView ci-dessus qui, agissant comme un élément cliquable 2-colonnes d'un histogramme. Pour définir la hauteur d'une barre, je reçois la « hauteur disponible » dans onLayout(), comme son étiquette moins la hauteur du conteneur:

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
    mAvailHeight = getHeight()-findViewById(R.id.label).getHeight(); // it works 

puis lui attribuer (multiplié par un 0.-1 valeur.) Comme une mise en page paramètre à la ImageView:

View bar = findViewById(R.id.bigBar); 
    RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) bar.getLayoutParams(); 
    rlp.height = Math.round((float)mAvailHeight * mBigBarHeight); 
} 

le peut être réglé par l'intermédiaire de cette fonction variable mBigBarHeight (0.-1.):

public void setBigBarHeight(float value, float max) { 
    mBigBarHeight = value/max;  
    requestLayout(); // 
    invalidate(); // do these help? i find no difference 
} 

maintenant. Lorsque j'ajoute un de ces "HistogramBar" dans onCreate() et définir les hauteurs et l'étiquette tout fonctionne comme je l'attends. Si j'essaie de les modifier plus tard, dites onClickSomething:

bar.setBigBarHeight(25, 100); 
bar.setSmallBarHeight(50, 100); 
bar.setLabel("jjk"); 

seule l'étiquette change. J'ai vérifié avec Hierarchy Viewer et en fait le LayoutParams a changé. Si je clique à nouveau, les changements apparaissent.

Le plus drôle est que même si je ne « Charger Afficher la hiérarchie » de l'outil changements s'affichent (sur l'émulateur) !! Ce qui se produit? Est-ce étrange? Je veux faire ça dans mon code pour que ça marche!

Je n'ai pas trouvé de question similaire. Merci.

+0

une question similaire: http://stackoverflow.com/q/2469466/503900. la réponse ne m'a pas aidé. – bigstones

Répondre

1

Lorsque vous chargez une hiérarchie à partir de l'outil, un relais/redessiner se produit pour mesurer les performances. Vous n'appelez probablement pas requestLayout() quand vous le devriez.

+0

Merci, j'ai réussi à avoir un seul composant correctement dessiné. Mais quand j'en ajoute dynamiquement certains à un LinearLayout avec un cycle for, ils ne sont pas disposés (encore une fois l'outil les fait apparaître). Pourriez-vous s'il vous plaît m'aider à comprendre où je devrais appeler requestLayout()? – bigstones

+0

note que, si dans le même code j'ajoute un simple ImageView à la place de ma vue, cela fonctionne. Donc, je suppose que le problème est mon point de vue. – bigstones

+0

suivi ici: http://stackoverflow.com/q/4163918/503900 – bigstones