#android #android-layout #android-linearlayout #android-imageview
#Android #android-layout #android-linearlayout #android-imageview
Вопрос:
У меня возникают проблемы при попытке установить layoutparams
ImageView
созданное программно:
imageView.setLayoutParams(new LinearLayout.LayoutParams(gallerySize.x, gallerySize.y));
ImageView находится внутри LinearLayout
, и я думаю, что это должно сработать, но я получаю эту ошибку:
09-30 10:33:24.450: ERROR/AndroidRuntime(5418): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
Возможно, тот факт, что это действие ImageView настроено на использование другого макета для портретного и альбомного просмотра (я использую это с другой копией XML-макета внутри папки layout-land). Когда он находится в портретном режиме, проблемная строка кода не выполняется, вместо этого я выполняю следующую строку:
imageView.setLayoutParams(new Gallery.LayoutParams(gallerySize.x, gallerySize.y));
Я попытался сохранить эту строку без изменений, но затем я получаю сообщение об ошибке:
09-30 10:49:47.450: ERROR/AndroidRuntime(5760): java.lang.ClassCastException: android.widget.Gallery$LayoutParams
Основное различие в портретном и альбомном макете заключается в том, что портрет использует a LinearLayout
с вертикальной ориентацией и имеет Gallery
виджет (который использует этот ImageView), в то время как проблемный пейзаж использует горизонтальную ориентацию и ListView
вместо Gallery
.
Я здесь немного потерялся, любые советы будут оценены.
ОТРЕДАКТИРОВАНО
ImageView реализован в этом классе:
public class ImageAdapter extends BaseAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
Bitmap temp = BitmapFactory.decodeFile(appFolder "/" imagesPath[position]);
//productImages[position] = temp;
imageView.setImageBitmap(temp);
if(landscape)
imageView.setLayoutParams(new LinearLayout.LayoutParams(gallerySize.x, gallerySize.y));
else
imageView.setLayoutParams(new Gallery.LayoutParams(gallerySize.x, gallerySize.y));
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imageView.setBackgroundResource(mGalleryItemBackground);
return imageView;
}
}
И здесь используется экземпляр ImageAdapter:
public onCreate(...) {
...
if(!landscape) {
Gallery gallery = (Gallery) findViewById(R.infoproduto.gallery);
gallery.setAdapter(new ImageAdapter(this));
gallery.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View v, int position, long id) {
setSelectedImage(position);
}
});
}
else {
ListView galleryLView = (ListView) findViewById(R.infoproduto.galleryLView);
galleryLView.setAdapter(new ImageAdapter(this));
galleryLView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View v, int position, long id) {
setSelectedImage(position);
}
});
}
}
Комментарии:
1. вы хотите изменить размер изображения с помощью LayoutParams
2. Пожалуйста, покажите код, в который вы добавляете imageview.
3. @surendra Да, если я не буду использовать фиксированный размер, изображения будут действительно большими для «галереи».
Ответ №1:
Ну, я нашел решение, это было так очевидно!
ImageView используется внутри ImageAdapter, и этот ImageAdapter устанавливается как адаптер в экземпляре ListView:
ListView galleryLView = (ListView) findViewById(R.infoproduto.galleryLView);
galleryLView.setAdapter(new ImageAdapter(this));
Поэтому вместо этого используйте LinearLayout.LayoutParams (это единственный макет в моем XML-файле), я использовал ListView.LayoutParams и это работает отлично!