【问题标题】:How can i get images dynamically from drawable folder?如何从可绘制文件夹中动态获取图像?
【发布时间】:2018-12-06 16:44:46
【问题描述】:

我通过静态名称获取图像,例如

{R.drawable.image1,R.drawable.image2,R.drawable.image3}

如果我有大约 50 张图像,我无法在数组中给出每个文件名,因此它需要是动态的,我该如何实现这一点。还请告诉我将动态代码放在哪里

package com.example.nauman.swipeapp;

import android.annotation.SuppressLint;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class SwipeAdapter extends PagerAdapter {
    private int[]image =  {R.drawable.image1,R.drawable.image2,R.drawable.image3};

    private Context cx;

    SwipeAdapter(Context cx){

        this.cx=cx;
    }

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

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

    @SuppressLint("SetTextI18n")
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {

        LayoutInflater layoutInflater = (LayoutInflater) cx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        assert layoutInflater != null;
        View view= layoutInflater.inflate(R.layout.page_fragment,container,false);
        ImageView imageView= view.findViewById(R.id.imageView);
        imageView.setImageResource(image[position]);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((RelativeLayout) object);
    }

}

【问题讨论】:

    标签: android android-viewpager swipe


    【解决方案1】:

    这个解决方案感觉有点hacky,不仅因为它使用反射,还因为它严重依赖于能够通过将它们的名称与特定模式匹配来识别你自己的可绘制资源(所以你应该尝试使用真正独特的名称图片)

    话虽如此,您可以按如下方式更改代码:

    保留private int[] image;,但在适配器的构造函数中初始化它:

    SwipeAdapter(Context cx){
        this.cx=cx;
        buildImageArray();
    }
    

    使用新方法(注意:您必须导入 java.lang.reflect.Field;)

    private void buildImageArray() {
    
        // this will give you **all** drawables, including those from e.g. the support libraries!
        Field[] drawables = R.drawable.class.getDeclaredFields();
        SparseIntArray temp = new SparseIntArray();
        int index = 0;
        for (Field f : drawables) {
            try {
                System.out.println("R.drawable." + f.getName());
                // check the drawable is "yours" by comparing the name to your name pattern
                // this is the point where some unwanted drawable may slip in,
                // so you should spend some effort on the naming/ matching of your pictures
                if (f.getName().startsWith("image")) {
                    System.out.println("R.drawable." + f.getName() + "==========================================");
                    int id = cx.getResources().getIdentifier(f.getName(), "drawable", cx.getPackageName());
                    temp.append(index, id);
                    index++;
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        image = new int[index];
        for (int i = 0; i < index; i++) {
            image[i] = temp.valueAt(i);
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果所有可绘制对象的名称如下:image1image2image3、...。
      那么你可以像这样获取他们的资源ID:

      int i = 1; // get the id of image1
      int resId = context.getResources().getIdentifier("image" + i, "drawable", context.getPackageName());
      

      并使用它:

      imageView.setImageResource(resId);
      

      为此,您必须提供有效的Context(在活动中您可以使用this)。

      【讨论】:

        【解决方案3】:

        如下更改适配器类的构造函数。只需添加图像列表作为参数

        public class SwipeAdapter extends PagerAdapter {
        private ArrayList<Integer> image;
        
        private Context cx;
        
        SwipeAdapter(Context cx, ArrayList<Integer> image){
        
            this.cx=cx
            this.image =image
        }
        
        @Override
        public int getCount() {
            return image.size;
        }
        
        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
           return (view==(RelativeLayout)object);
        }
        
         @SuppressLint("SetTextI18n")
         @NonNull
         @Override
         public Object instantiateItem(@NonNull ViewGroup     container, int position) {
        
           LayoutInflater layoutInflater = (LayoutInflater)      cx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        assert layoutInflater != null;
        View view=   layoutInflater.inflate(R.layout.page_fragment,container,false);
        ImageView imageView=  view.findViewById(R.id.imageView);
        imageView.setImageResource(image[position]);
        container.addView(view);
        return view;
        }
        
        @Override
        public void destroyItem(@NonNull ViewGroup container,     int position, @NonNull Object object) {
        container.removeView((RelativeLayout) object);
        } 
        

        使用图像列表实例化适配器,如下所示。为了在可绘制资源中的图像之间循环,如果您希望适配器中有 50 个图像,则需要在其名称中添加索引,顺序为 1 到 50

         ArrayList<Integer> images=new ArrayList<Integer>()
         for(int i =0;i<50; i++){
         int res = getResources().getIdentifier("<your pakecgename>:drawable/abc"+i, null, null);
         images.add(res);
        }
        SwipeAdapter adapter = new SwipeAdapter(activity, images)
        

        【讨论】:

          猜你喜欢
          • 2012-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多