2010-10-14 4 views
1

J'ai WebView que je l'ai ajouté à un groupe de vue:Android: View.measure (int, int) veut toujours être (0,0)

webView = new WebView(context); 
addView(webView, ViewGroup.LayoutParams.WRAP_CONTENT); 

Ce vit dans le constructeur de mon viewgroup.

ensuite sur la mise en page, je veux le faire:

webView.measure(View.MeasureSpec.makeMeasureSpec(getWidth(),View.MeasureSpec.EXACTLY), 
       View.MeasureSpec.makeMeasureSpec(3000, View.MeasureSpec.AT_MOST)); 

Malheureusement, à moins que je précise EXACTLY, le webView.getMeasuredHeight() retourne toujours 0. Ce que je veux faire, c'est déterminer la taille de la webview pour que je puisse y poser d'autres éléments. J'ai précisé que je veux que le webview soit assez grand pour englober son contenu et j'ai fourni beaucoup d'espace. Alors pourquoi est-ce encore 0?

Merci

Update 1

Par WebView temps se mesure() demande, il doit savoir la quantité de données qu'il a, non?

webView = new WebView(context); 
webView.loadData("<html></html>","text/html", "utf-8"); 
addView(webView, new ViewGroup.LayoutParams(getWidth(), 1000)); 

Répondre

4

Ce:

addView(webView, ViewGroup.LayoutParams.WRAP_CONTENT); 

est très mal. Le second paramètre, lorsqu'il est passé en int, est l'index de la vue à l'intérieur du parent. Cela ne fait pas ce que vous pensez qu'il fait. Vous devez passer une nouvelle instance de LayoutParams à la place.

Votre problème est probablement que vous effectuez une mesure avant que le WebView ait eu le temps de charger le document HTML. Vous mesurez avec la contrainte AT_MOST 3000, et 0 respecte définitivement ces contraintes. WebView vous indique simplement que son contenu a une hauteur de 0 pour le moment.

+0

Oh, wow. Vous avez tout à fait raison. J'ai mis à jour le code ci-dessus, sans différence. – EightyEight

+0

Je ne pense pas loadData() est synchrone. Vous devez attendre que WebView ait fini d'analyser les données et de créer le DOM. Il doit y avoir un auditeur pour cela. –

+0

Pour les futurs googleurs; WebView distribue un événement à un objet PictureListener lorsqu'il a fini de se disposer. – EightyEight

1

Je pense que vous mesurez la vue onCreate(). La vue n'est pas encore dessinée. Vous devez attendre jusqu'à ce que la vue soit dessinée avant de pouvoir la mesurer.

+0

Peut-être que mon approche n'est pas correcte. J'ai besoin de savoir quelle est la taille de la vue avant de pouvoir dessiner, non? – EightyEight

+1

Comment exactement le dessinez-vous et où? Pourquoi n'utilisez-vous pas simplement wrap_content? – Falmarri

+0

J'ai un rappel qui est attaché à un bouton. Le rappel définit la visibilité de webview sur VISIBLE, puis appelle webView.measure(), puis appelle webView.layout(). Je ne suis pas sûr de ce qu'est wrap_content. – EightyEight

Questions connexes