오늘 해볼 예제는 RatingBar를 통한 이벤트 처리를 해보자.
일단은 RatingBar 위젯에 대해서 알아보자.
RatingBar의 속성은 아래와 같은것들이 있다.
XML 속성
android:isIndicator | true 면 사용자가 별점을 바꿀수가 없음 |
android:numStars | 몇개의 별까지 만들것인지 |
android:rating | 디폴트로 설정할 등급 |
android:stepSize | 별점을 매길때 몇 단위로 만들것인지 정하는 부분 |
참조 사이트 : developer.android.com/reference/android/widget/RatingBar
위의 xml 속성을 소스를 통해서 한번 보자.
<RatingBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="5" android:layout_gravity="center" android:stepSize="0.5" android:isIndicator="true" android:rating="2.5"/>
일단 layout_width는 wrap_content로 해놨다.
RatingBar는 wrap_content로 해야 한다. 왜냐 하면 match_parent로 하면 별의 개수가 우리가 정하는 대로 되지 않고
width가 부모에 맞춰서 정해지기 때문에 별의 개수도 부모의 크기에 맞게 만들어진다.
그래서 무조건 wrap_content로 만들어줘야 한다.
numStars는 5로 맞춰서 별을 5개로 만들었고
stepSize는 0.5로 만들어서 별점을 매길수 있는 단위를 0.5로 맞췄다.
그리고 rating은 2.5로 맞춰서 디폴트로 설정되는 별점을 2.5로 되게 설정했다.
그리고 isIndicator라는 속성이 있는데 이부분은 true로 설정을 한번 해봤다.
true로 설정을 하니 클릭으로 해당 별점을 따로 매길수가 없었다.
false로 하면 사용자가 별점을 매길수가 있다.
따로 isIndicator="false"를 하지 않아도 별점을 매길 수 있는 거 보니 디폴트로 false 처리되는 것 같았다.
위 xml 소스의 결과 화면을 보여주겠다.
자 그럼 이제 RatingBar의 자바 메소드가 어떤 것들이 있는지 한번 보자.
1. getAccessibilityClassName() - 반환형 : CharSequence
이건 해당 함수의 클래스 이름을 받아오는 함수이다.
(아마 쓸일은 거의 없을 것 같다... - 욱재 피셜 -)
2. getNumStars() - 반환형 : int
표시된 별의 수를 반환하는것이다.
xml에서 적은 numStars 값을 받아온다.
3. getRating() - 반환형 : float
현재 매겨진 별의 개수를 반환한다.
4. getStepSize() - 반환형 : float
별점을 매길 수 있는 단위값을 반환한다.
5. isIndicator() - 반환형 : boolean
현재 사용자가 별점을 매길수 있는지 없는지 확인해준다.
true면 사용자가 별점 못 매기고
false면 사용자가 별점을 매길 수가 있다.
※여기서는 set 해주는 부분이라 반환 값이 없어 모두 반환형이 void이다.
6. setIsIndicator(boolean 매개변수)
사용자가 값을 매길 수 있게할지 결정 짓는 부분
true면 값 못 매기고 false면 매길수 있음
7. setMax(int 변수)
진행률 최대 범위를 설정한다.
하지만 이건 RatingBar에서는 사용 안 하는 것 같다.
왜냐면 어차피 별의 개수를 설정하는 setNumStars()가 있기 때문이다.
8. setNumStars(int 변수)
표시할 별의 수의
※주의할 점
xml 소스에서 numStars와 다르게 설정을 하더라고 rating 값은 setNumStars()에서 설정한 값으로
설정되는 것이 아닌 xml에서 설정한 numStars 수에 맞게 rating을 해준다.
<RatingBar android:id="@+id/rb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="5" android:rating="2.5" android:layout_gravity="center" android:stepSize="0.5"/>
위에서 보면 numStars는 5이기 때문에 2.5면 절반이 된다.
그래서 setNumStars(7);로 별을 7칸으로 바꿔도
rating은 위에서 설정한 2.5 즉 절반에 맞게 설정을 해준다.
그래서 별의 개수는 xml과 같게 설정을 해줘야 한다.
만약 바꿀 거면 기존 걸 없애고 아예 다시 만들어야 할 것 같다.
9. setRating(float 변수)
별을 점수를 설정해준다.
이것도 위처럼 xml의 numStars와 자바에서 setNumStars()와 다르면 rating도 엉킨다 그러니
다르게 만들면 안 된다.
10. setStepSize(float 변수)
이건 등급 매기는 단계를 바꿔주는 부분이다.
자 그럼 실제로 예제를 통해서 보자
RatingBar rb = (RatingBar)findViewById(R.id.rb); Log.v("오브젝트 클래스 이름",rb.getAccessibilityClassName().toString()); Log.v("별의수 ", String.valueOf(rb.getNumStars())); Log.v("현재 별 점수 ", String.valueOf(rb.getRating())); Log.v("현재 단위 ", String.valueOf(rb.getStepSize())); Log.v("사용자가 별점 매기기 가능 ? ", String.valueOf(rb.isIndicator())); rb.setNumStars(7); Log.v("별의수 ", String.valueOf(rb.getNumStars())); rb.setRating(6); Log.v("현재 별 점수 ", String.valueOf(rb.getRating())); rb.setRating(1); rb.setStepSize(1);
결과 화면
그럼 이제 이걸 가지고 활용을 해보자.
내가 해보려는 것은 아래와 같다.
1. RatingBar 위젯을 통해서 별점을 입력받는다.
2. 제출 버튼을 누르면 입력받은 별점을 결과 TextView에 출력시킨다.
xml은 아래와 같다.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="별점을 입력해주세요!!" android:layout_gravity="center" /> <RatingBar android:id="@+id/rb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="7" android:rating="2.5" android:layout_gravity="center" android:stepSize="0.5"/> <Button android:id="@+id/submit" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="제출"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/hobbyIntro" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="나의 별점 : "/> <TextView android:id="@+id/showHobby" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp"/> </LinearLayout> </LinearLayout>
결과 화면
자바 소스는 아래와 같다.
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //RatingBar 위젯 가져오기 RatingBar rb = (RatingBar)findViewById(R.id.rb); //제출 버튼 Button submit = (Button)findViewById(R.id.submit); //라디오 버튼 결과값 받을라고 final TextView showHobbies = (TextView)findViewById(R.id.showHobby); //제출 버튼 클릭했을때 submit.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Toast.makeText(getApplicationContext(),"제출했당~",Toast.LENGTH_SHORT).show(); showHobbies.setText(String.valueOf(rb.getRating())); } }); } }
제출 버튼이 클릭했을 때
RatingBar인 rb에서 getRating()해서 가져오고 해당 값을 String.valueOf()해서 String 형태로 바꿔준다.
※잡담
toString()을 사용하지 않고 String.valueOf() 쓴 이유는 일단 오류가 나서 추천해주기도 했는데
이참에 이 둘의 차이를 찾아보니 toString은 오브젝트를 반환하는 거지만 String.valueOf()는 문자열로 변경해준다고 한다.
그래서 문자열로 변환해주는 건 String.valueOf()가 더 좋다고 한다. 앞으로 이걸 사용해야겠다.
무튼 이렇게 해서 결과 화면에다가 rb에서 값을 받아와서 결과창 출력하는 showHobbies뷰에다가 setText()해서 집어
넣었다.
느낀점 - 앞으로 뷰의 메소드들을 웬만하면 다 살펴보자.
'코딩일기 > android studio' 카테고리의 다른 글
Android 독학 10일차 : 커스텀 뷰(Custom View) 만들기 (0) | 2021.03.18 |
---|---|
Android 독학 9일차 : View 생명주기(View를 그리는 과정) (0) | 2021.03.16 |
Android 독학 7일차 : Radio Button 이벤트 처리 하기 (0) | 2021.03.11 |
Android 독학 6일차 : CheckBox 이벤트 처리 (0) | 2021.03.11 |
안드로이드 독학 5일차 : EditText 이벤트 처리 (0) | 2021.03.10 |