管理片段,公共静态viewpager

时间:2014-04-28 21:00:09

标签: android android-fragments static instantiation deprecated

我需要一些建议。 我有一个带有ViewPager的片段。我将它用作带有一些图像的图库。图像从Web加载并存储在Bitmap数组中。

起初我用过..

public class GalleryPageAdapter extends PagerAdapter {

public GalleryPageAdapter(){

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

但是,现在不推荐使用instatiateItem和其他方法...... 我做了一些研究跟随其他帖子 Class extending Fragment - error says make sure class name exists, is public, and has an empty constructor that is publicUnable to instantiate fragment make sure class name exists, is public, and has an empty constructor that is public

现在它可以正常工作

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数组为“null”吗? (该片段被重新填充并被其他活动使用)
  2. 我的上一个代码不需要静态类或静态数组。保留代码是好的,因为它被弃用了吗?
  3. 什么意味着将代码保留在弃用版本中?
  4. 提前,比你的时间和注意力。

1 个答案:

答案 0 :(得分:1)

我认为你应该回到这个用例的原始代码 - 如果你只想展示一个图像库,那么基于Views而不是Fragments构建一个ViewPager要简单得多。当您为每个页面设置更复杂的屏幕时,通常会使用片段,例如如果ViewPager是顶级导航UI。

对于静态Drawable引用可能遇到的问题,有一个非常古老但still relevant article。 Drawables引用了Views,它引用了一个Activity。通过使用静态Drawable引用,您可以轻松泄漏Activity上下文。如果同时支持垂直和纵向方向,则每次旋转设备时都会销毁并重新创建活动。在这种情况下,您需要注意如何保留加载的位图(您只想在用户离开Activity时清除数组,而不是在它们旋转时清除数组)。

PagerAdapter类实际上有两个版本的instantiateItem方法:

  1. public Object instantiateItem (View container, int position)
  2. public Object instantiateItem (ViewGroup container, int position)
  3. 不推荐使用原始版本(#1)以支持第二种方法。当您重写instantiateItem时,通常需要将View添加到容器中。使用第一个方法签名,您首先需要在添加之前将容器转换为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);
        }
    }