마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

랜덤으로 이미지뷰 띄우는 문제인데

0 추천

랜덤으로 이미지뷰를 띄우는데

예를들어 10개의 사진중에서 랜덤으로 띄웁니다.

처음 버튼을 눌렀을 때 3번이미지가 나왔다는 가정하에,

다시 버튼을 눌렀을 때 3번이미지를 제외한 다른이미지가 띄워지도록 하려고 합니다.

어떤식으로 작성을 해야할까요,,

 

btn_ko1[0].setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
          

            btn_ko1[0] = (ImageView)findViewById(R.id.btn_ko1);

            Random ram = new Random();
            int num = ram.nextInt(img.length);

            btn_ko1[0].setImageResource(img[num]);




        }
    });
}

 

식신왕 (160 포인트) 님이 2021년 8월 13일 질문

2개의 답변

0 추천
문자열로 리소스 id를 가져오는 방법이 있습니다.

String mDrawableName = "myimageName";
int resID = res.getIdentifier(mDrawableName , "drawable", getPackageName());
imgView.setImageResource(resID);

[참고]

https://stackoverflow.com/questions/5254100/how-to-set-an-imageviews-image-from-a-string
포스코 (1,490 포인트) 님이 2021년 8월 13일 답변
0 추천
public class YourActivity extends AppCompatActivty {

   // 멤버 변수들
    private final List<Integer> imageIndices = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
    private final RandomIndexProvider indexProvider = new RandomIndexProvider(imageIndices);

    public void onCreate(Bundle saveInstance) {
        super.onCreate(budle);
        // 다른 코드들 ....

        btn_ko1[0].setOnClickListener(new View.OnClickListener()    {
        @Override
        public void onClick(View view) {
      
            btn_ko1[0] = (ImageView)findViewById(R.id.btn_ko1);

            // TODO : 리턴값이 -1일 때의 처리 필요.            
            int num = indexProvider.next();

            btn_ko1[0].setImageResource(img[num]);

            
        }
    });
}

    }
}

public class RandomIndexProvider {
   private final Random ram = new Random();
   private final List<Integer> remainedIndices;
 
   public RandomIndexProvider(List<Integer> indices) {
          remainedIndices = new ArrayList<>(indices);
    }
 
    public int next() {
        if (remainedIndices.size() < 1)  return -1;
 
        int position = ram.nextInt(remainedIndices.size());
        int result = remainedIndices.get(position);
        remainedIndices.remove(position);
        return result;
     }

     public boolean hasNext() {
        return remainedIndices.size() > 0;
     }
}

public class RandomIndexProviderTest {

    private final List<Integer> testIndices = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
    private final RandomIndexProvider indexProvider = new RandomIndexProvider(testIndices);

    @Test
    public void testNext() {
        while (indexProvider.hasNext()) {
            int position = indexProvider.next();
            System.out.println("### result : " + position);
        }
    }
}

 

spark (227,510 포인트) 님이 2021년 8월 13일 답변
spark님이 2021년 8월 15일 수정
Attempt to invoke virtual method 'int java.util.Random.nextInt(int)' on a null object reference
        at com.example.firstapptest.ko$RandomIndexProvider.next(ko.java:79)
        at com.example.firstapptest.ko$1.onClick(ko.java:56)
 
자바79번째줄 int result = remainedIndices.get(position);
56번째줄 int num = indexProvider.next();

오류가 나서 죽어버리네요.. 무엇이 문제일까요,,
Random가 널인데요. 어디다 생성하셨나요? 제 예제는 RandomIndexProvider라는 클래스이 멤버 인스턴스예요. 해당 클래스 안에서 생성하시던가 아니면 밖에서 생성해서 제공하던가 해야죠.
음,, 다시 알려주신대로 클래스 저도 똑같이  RandomIndexProvider로 생성하고
그 안에 코드 넣어봤어요. 이번엔
Attempt to invoke virtual method 'int com.example.firstapptest.RandomIndexProvider.next()' on a null object reference
        at com.example.firstapptest.ko$1.onClick(ko.java:59)

요런 오류네요,,

자바 59번째줄 int num = indexProvider.next();

너무 어렵네유,,
indexProvider는 멤버 변수로 생성하셔야 해요. 해당 인스턴스의 에러라면 생성위치가 잘 못되어있을 수 있는데, 이게 아니라면 관련 XML과 다른 변수가 어떻게 초기화 되는지를 포함한 코드를 올려주세요.
...