2010-05-19 27 views
11

J'essaie de gonfler un ImageView qui met à l'échelle un Drawable que je peux afficher dans un GalleryView. Mon code pour gonfler la vue semble fonctionner correctement, sauf que les attributs de l'ImageView ne sont pas appliqués. Plus précisément, l'ImageView gonflé n'a pas la largeur/hauteur que je lui ai assignée via les paramètres android: layout en XML. Est-ce que quelqu'un peut me montrer ce que je fais mal?Gonflé ImageView à mettre dans GalleryView n'est pas la bonne taille

Je veux définir la largeur/hauteur de l'image en dp, de sorte qu'il est la bonne taille sur plusieurs écrans dpis et soutenir Android 1.5+. En conséquence, je ne peux pas utiliser quelque chose comme:

i.setLayoutParams(new Gallery.LayoutParams(150, 116) 

Ma définition de mise en page est:

<?xml version="1.0" encoding="utf-8"?> 
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="150dp" android:layout_height="116dp" 
    android:background="@drawable/gallery_item_background" 
    android:scaleType="fitXY" /> 
</ImageView> 

Et l'extrait que je utilise pour gonfler le ImageView est:

public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = getLayoutInflater(); 
     ImageView i = (ImageView) inflater.inflate(R.layout.gallery_item, null); 
     i.setImageResource(mImageIds.get(position)); 
     i.setScaleType(ImageView.ScaleType.FIT_XY); 

     return i; 
    } 
+0

Pour le moment, j'ai piraté une solution en utilisant DisplayMetrics.density. float den = mDisplayMetrics.density; convertView.setLayoutParams (nouveau Gallery.LayoutParams ((int) (den * 150), (int) (den * 116))); – Richard

Répondre

24

l'astuce consiste simplement à utiliser la version suivante de inflate().

inflater.inflate(R.layout.gallery_item, parent, false); 

les deux derniers paramètres sont obligatoires Si vous passez « null » comme parent, le gonfleur ne sait pas quel type de paramètres de mise en page créer et donc ignore tous les attributs XML android:layout_. Le dernier paramètre indique simplement au gonfleur de ne pas ajouter la vue gonflée au parent tout de suite. Si vous passez true (au moins dans la méthode getView() d'un adaptateur), de mauvaises choses se produiront.

1

Je suis pas sûr mais cela pourrait fonctionner. Donnez un identifiant à votre imageview dans votre xml (disons qu'il est « @ + id/image »:

public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = getLayoutInflater(); 
    View view = (View) inflater.inflate(R.layout.gallery_item, null); 
    ImageView i = (ImageView) view.findViewById(R.id.image); 
    i.setImageResource(mImageIds.get(position)); 
    i.setScaleType(ImageView.ScaleType.FIT_XY); 

    return view; 
} 

par la façon dont vous devez optimiser vérifier si convertView est nul afin de recycler vues Vérifiez ceci:. http://code.google.com/events/io/2009/sessions/TurboChargeUiAndroidFast.html

+0

J'ai essayé d'ajouter un ID à mon ImageView en vain :-( – Richard

+1

Bon conseil sur le recyclage de la vue BTW – Richard

+0

J'ai fait quelque chose de similaire, mais à la place utilisé un gridview avec une mise en page personnalisée par élément: un imageview et un texte ci-dessous. Etes-vous sûr qu'il n'y a pas de différence? Essayez de mettre quelque chose comme 20dip pour les deux et vérifiez si vous voyez des changements, et après essayer une valeur élevée comme 300dip. –