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

[안드로이드] string-array 버튼 출력

0 추천

value 폴더에 string-array 배열에 문자열을 10개 넣어놨습니다.

String[] array = getResources().getStringArray(R.array.array );

이렇게 가져와서 i=0으로 선언후

textView.setText(arra[i]);
이런식으로 array배열에 있는 값 0번부터 버튼을 한 번 클릭할 때마다 하나씩 출력하고 싶습니다.
 
제가 구현하고 싶은 계획은
rigtButton을 누르면 array[0] 출력, 한 번 더 누르면  array[1]번 출력 이런식으로 배열 값을 하나씩 출력하고 
array[5]인 상황에서 leftButton을 누르면 array[4]가 출력되게 끔하고 싶습니다 ...도와주세요ㅜㅜ
그리고 array[0]에서 leftButton을 누르면 array 배열의 마지막인 array[10]이  출력되게끔 하고 싶습니다..
 
개발개발자 (1,100 포인트) 님이 2020년 11월 15일 질문

2개의 답변

+1 추천
 
채택된 답변

여러가지 방법이 있을 것 같긴한데, 간단한 방법은 List를 받아서 포지션에 따른 아이템을 리턴하는 클래스를 만드는 겁니다.

public class CircularIterator<T> {
    private int currentPosition = 0;
    private final List<T> items;

    public CircularIterator(List<T> items) {
        this.items = items;
    }

    private int lastIndex() {
        return items.size() - 1;
    }

    public T currentItem() {
        return items.get(currentPosition);
    }

    public boolean hasNext() {
        return currentPosition < lastIndex();
    }

    public T next() {
        if (hasNext()) {
            currentPosition++;
            return currentItem();
        }

        currentPosition = 0;
        return currentItem();
    }

    public boolean hasPrevious() {
        return currentPosition > 0;
    }

    public T previous() {
        if (hasPrevious()) {
            currentPosition--;
            return currentItem();
        }

        currentPosition = lastIndex();
        return currentItem();
    }

    public int nextIndex() {
        return currentPosition + 1;
    }

    public int previousIndex() {
        return currentPosition - 1;
    }
}


public class CircularIteratorTest {

    final CircularIterator it = new CircularIterator(Arrays.asList("text1", "text2", "text3", "text4", "text5"));

    @Test
    public void testIterator() {
        assertEquals("text1", it.currentItem());
        assertEquals("text2", it.next());
        assertEquals("text3", it.next());
        assertEquals("text4", it.next());
        assertEquals("text5", it.next());
        assertEquals("text1", it.next());
        assertEquals("text2", it.next());
        assertEquals("text2", it.currentItem());

        assertEquals("text1", it.previous());
        assertEquals("text1", it.currentItem());

        assertEquals("text5", it.previous());
        assertEquals("text4", it.previous());
        assertEquals("text3", it.previous());
        assertEquals("text2", it.previous());
    }
}

님의 rigtButton의 클릭이벤트에서

private final CircularIterator<String> textIterator = new CircularIterator<>(
Arrays.asList(getStringArray(R.array.array))
); 

leftButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
          displayText(textIterator.previous());
      }
});

rigtButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
          displayText(textIterator.next());
      }
});

더 좋은 방법도 분명히 있을 겁니다. 암튼 도움이 되시길...

spark (224,800 포인트) 님이 2020년 11월 16일 답변
개발개발자님이 2020년 11월 16일 채택됨
+1 추천

마침 코딩중이라 한번 해봤어요.

private int index = 0;
private String[] array = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    ..
    textView.setText(array[index]);
    ..
    buttonLeft.setOnClickListener(this);
    ..
    buttonRight.setOnClickListener(this);
}
@Override
public void onClick(View v) {
    if(v.getId() == R.id.buttonLeft) {
        onButtonClick(false);
    } else if(v.getId() == R.id.buttonRight) {
        onButtonClick(true);
    }
}
private void onButtonClick(Boolean isPlus) {
    if(isPlus) {
        if(++index >= array.length) {
            index = 0;
        }
    } else {
        if(--index < 0) {
            index = array.length - 1;
        }
    }
    ..
    textView.setText(array[index]);
}
버닝 (4,880 포인트) 님이 2020년 11월 16일 답변
...