Manage Fragment , общедоступный статический пейджер

Мне нужен совет по этому поводу. У меня есть фрагмент с ViewPager. Я использую его как галерею с несколькими изображениями. Изображения загружаются из Интернета и сохраняются в массиве растровых изображений.

Сначала использовал..

public class GalleryPageAdapter extends PagerAdapter {

public GalleryPageAdapter(){

}
  public Object instantiateItem(View collection, int position) {
  }
 ...
//all other methods
}

но instatiateItem и другие методы теперь устарели... Я провел некоторое исследование, следуя другим сообщениям Фрагмент расширения класса - ошибка говорит, что имя класса существует, является общедоступным и имеет пустой общедоступный конструктор и Невозможно создать экземпляр фрагмента, убедитесь, что имя класса существует, является общедоступным , и имеет пустой общедоступный конструктор

Теперь работает без ошибок

public class sEstablecimiento extends android.support.v4.app.FragmentActivity{
static BitmapDrawable iconos[];
//load bitmaps into iconos[] from web

static class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    static int position;
    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        this.position=position;
        return new ScreenSlidePageFragment();
    }

    @Override
    public int getCount() {
        return iconos.length;
    }

}

public static class ScreenSlidePageFragment extends Fragment {
    private BitmapDrawable image;

    public ScreenSlidePageFragment() {
       image=iconos[ScreenSlidePagerAdapter.position];
    }

    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                             Bundle savedInstanceState) {
        ViewGroup rootView =(ViewGroup)inflater.inflate(R.layout.fragment_screen_slide_page, container, false);
        ImageView icono=(ImageView)rootView.findViewById(R.id.imagen);
        icono.setImageDrawable(iconos[ScreenSlidePagerAdapter.position]);
        return rootView;
    }

  }

И, как всегда, вот мои конкретные вопросы

  1. Поскольку класс и методы фрагмента являются статическими, ему необходимо, чтобы массив BitmapDrawable был статическим и содержал несколько изображений. Можно ли сделать массив BitmapDrawable «нулевым», когда действие уничтожается, чтобы освободить память? (фрагмент пополняется и используется другими активностями)
  2. Мой последний код не нуждается в статических классах или статическом массиве. Можно ли сохранить код, поскольку он считается устаревшим?
  3. Что подразумевает сохранение кода в устаревшей версии?

заранее, чем вы за ваше время и внимание.


person UrielUVD    schedule 28.04.2014    source источник


Ответы (1)


Я думаю, что вам следует вернуться к исходному коду для этого варианта использования — если вы просто хотите показать галерею изображений, гораздо проще создать ViewPager на основе представлений, а не фрагментов. Обычно вы используете фрагменты, когда у вас есть более сложные экраны для каждой страницы, например. если бы ViewPager был пользовательским интерфейсом навигации верхнего уровня.

Есть довольно старая, но все еще актуальная статья о проблемах, с которыми вы можете столкнуться со статическими ссылками на Drawable. Drawables имеют ссылки на Views, которые имеют ссылки на Activity. Используя статические ссылки на Drawable, вы можете легко пропустить контекст Activity. Если вы поддерживаете как вертикальную, так и книжную ориентацию, ваша активность будет уничтожаться и создаваться заново каждый раз, когда устройство поворачивается. В этом случае вам нужно быть осторожным с тем, как сохранить загруженные растровые изображения (вы хотите очистить массив только тогда, когда пользователь покидает действие, а не когда он вращается).

Класс PagerAdapter на самом деле имеет две версии метода instanceItem:

  1. общедоступный объект instanceItem (контейнер представления, позиция int)
  2. публичный объект instanceItem (контейнер ViewGroup, позиция int)

Оригинал (№1) устарел в пользу второго метода. Когда вы переопределяете instanceItem, вам обычно нужно добавить свой вид в контейнер. С первой сигнатурой метода вам сначала нужно будет привести свой контейнер к ViewGroup перед добавлением. Сигнатура второго метода позволяет избежать этого, предоставляя вам ViewGroup с самого начала. В PagerAdapter есть несколько подобных устаревших методов — все они имеют эквивалентные версии, которые принимают ViewGroup вместо View.

Вот некоторый (непроверенный) пример кода, который реализует PagerAdapter для отображения изображений:

public class GalleryPagerAdapter extends PagerAdapter {

    private Context mContext;
    private BitmapDrawable[] mIcons;

    public GalleryPagerAdapter(Context context, BitmapDrawable[] icons) {
        mContext = context;
        mIcons = icons;
    }

    @Override
    public int getCount() {
        return mIcons.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, final int position) {
        // You can inflate a layout here instead and apply styling to the ImageView
        ImageView imageView = new ImageView(mContext);

        BitmapDrawable icon = mIcons[position];
        imageView.setImageDrawable(icon);

        container.addView(imageView, 0);
        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
}
person antonyt    schedule 29.04.2014
comment
Мой исходный код точно такой же, как тот, который вы разместили. спасибо за статью. В этом случае я оставлю старый код и буду использовать новый способ в главном меню навигации для некоторых экспериментов. Спасибо! - person UrielUVD; 29.04.2014