8
votes

Extension de Framelayout, les vues d'enfants ne montreront plus

Ceci est mon code avec framelayout : xxx

the imageview show bien.

Maintenant, j'ai une disposition personnalisée s'étend de Framelayout, par exemple MyFramelayout.

dans myFramelayout, je veux que la hauteur de la mise en page soit toujours la moitié de la largeur, de sorte que mon code est: xxx

puis l'utiliser xml: xxx

mais maintenant l'image interne a disparu.

Je pense que je ne sais pas Onpeasure ou ou Onlayout correctement. Je suppose que j'ai besoin de redimensionner les vues des enfants aussi. Mais je ne sais pas quoi faire maintenant.


Mise à jour

par thedimasig Il suffit de vérifier mon code et de mettre à jour ma question. Merci


2 commentaires

Deux suggestions: 1. Vérifiez vos méthodes OnMeasure et OnLayout Dans votre MyFramelayout classe. 2. Essayez d'utiliser l'outil HierarhyViewer pour le débogage. En outre, si cela est possible montrer tout le code de votre mise en page personnalisée


@Thedimasig, je viens de mettre à jour ma question, veuillez consulter :)


3 Réponses :


2
votes

Je suppose dans votre ONMEASURE Méthode que vous oubliez d'appeler ONMEASURE sur toutes les vues enfants, y compris votre imageView. Vous devez aller à travers toutes vos vues de votre enfant et appeler OnMeasure sur eux quelque chose comme ceci: xxx


4 commentaires

Je viens de lire la source de framelayout , le onpeasure et onLayout semble assez compliqué, existe-t-il un moyen simple de faire cela?


Au lieu de cela, priorisez-le à la place de tout le corps de la méthode et de la construction () Essayez d'appeler Super.Enméasure (WidthMeasuresPec * 0,5, HightMeasuresPec) avec vos paramètres. Cette solution peut être exigée de remplacer trop d'Onlayout de cette manière


J'ai essayé widthmeasurespec * 0.5 , mais la taille finale semble non attendue. Je ne peux pas l'obtenir, pourriez-vous me donner un exemple de travail lorsque vous avez le temps?


Malheureusement non. Si le truc avec Super.Enmeasure, l'appel ne fonctionne pas, j'ai bien peur que vous ayez besoin de mettre en œuvre votre propre ONMEASURE et ONLAYOUT et n'oubliez pas d'enfant, bonne chance =)



10
votes

Vous ne voyez aucune vue enfant parce que vous ne remplacez pas la méthode OnMeasure correctement. Vous pouvez laisser la classe Super classe implémenter la logique (de sorte que les vues de l'enfant seront affichées), puis réinitialisez la largeur et la hauteur calculées pour myFramelayout : xxx

si cette mise en page Vous avez posté votre mise en page complète, mon code pourrait ne pas fonctionner.


0 commentaires

19
votes

Le moyen le plus simple est de changer les mesuresPec dans OnMeasure, mais d'appeler toujours Super:

 @Override
 protected void onMeasure(int widthMeasureSpec,
                     int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = (int) (width * 0.5);
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}


2 commentaires

Je peux confirmer ça fonctionne. Sans appeler Super.Enméasure (), la vue sur l'enfant n'était pas visible!


Merci beaucoup, j'ai lu beaucoup de discussion, c'est la seule réponse valide pour rendre les enfants redimensionnés avec la mise en page des parents!