Увеличенный ImageView для размещения в GalleryView имеет неправильный размер

Я пытаюсь раздуть ImageView, который масштабирует Drawable, который я могу отобразить в GalleryView. Мой код для раздувания представления работает нормально, за исключением того, что атрибуты ImageView не применяются. В частности, завышенный ImageView не имеет ширины/высоты, которые я установил для него с помощью параметров android:layout в XML.

Может кто-нибудь показать мне, что я делаю неправильно?

Я хочу установить ширину/высоту изображения в dp, чтобы он был правильным размером на нескольких экранах и поддерживал Android 1.5+. В результате я не могу использовать что-то вроде:

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

Мое определение макета:

<?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>

И фрагмент, который я использую для раздувания ImageView:

    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;
    }

person Richard    schedule 19.05.2010    source источник
comment
На данный момент я взломал решение, используя DisplayMetrics.density. число с плавающей запятой = mDisplayMetrics.density; convertView.setLayoutParams(new Gallery.LayoutParams((int)(den * 150), (int)(den * 116)));   -  person Richard    schedule 21.05.2010


Ответы (2)


Хитрость заключается в том, чтобы просто использовать следующую версию inflate():

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

Последние два параметра являются обязательными. Если вы передадите «null» в качестве родителя, инфлятор не знает, какой тип параметров макета создать, и поэтому игнорирует все атрибуты android:layout_ XML. Последний параметр просто сообщает инфлятору, что не нужно сразу добавлять расширенный вид к родителю. Если вы передадите true (по крайней мере, внутри метода getView() адаптера), произойдут плохие вещи.

person Romain Guy    schedule 27.06.2010

Я не уверен, но это может сработать. Дайте идентификатор вашему изображению в вашем xml (скажем, это "@+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;
}

Кстати, вы должны оптимизировать его, проверяя, является ли convertView нулевым, чтобы перерабатывать представления. Проверьте это: http://code.google.com/events/io/2009/sessions/TurboChargeUiAndroidFast.html

person Jan S.    schedule 19.05.2010
comment
Отличный совет по переработке представления BTW. - person Richard; 21.05.2010
comment
Я сделал что-то похожее, но вместо этого использовал вид сетки с пользовательским макетом для каждого элемента: изображение и текст ниже. У меня работало изменение ширины и высоты в файле xml. Кстати, вы уверены, что нет никакой разницы? попробуйте поставить что-то вроде 20dip для обоих и проверьте, видите ли вы какие-либо изменения, а после попробуйте какое-нибудь высокое значение, например 300dip. - person Jan S.; 21.05.2010