본문 바로가기
코딩일기/android studio

Android 독학 8일차 : RatingBar 이벤트 처리

by 욱파이어니어 2021. 3. 12.
728x90
반응형

오늘 해볼 예제는 RatingBar를 통한 이벤트 처리를 해보자.

 

일단은 RatingBar 위젯에 대해서 알아보자.

 

RatingBar의 속성은 아래와 같은것들이 있다.

 

XML 속성

android:isIndicatortrue 면 사용자가 별점을 바꿀수가 없음
android:numStars몇개의 별까지 만들것인지
android:rating디폴트로 설정할 등급 
android:stepSize별점을 매길때 몇 단위로 만들것인지 정하는 부분 

참조 사이트 : developer.android.com/reference/android/widget/RatingBar

 

RatingBar  |  Android 개발자  |  Android Developers

 

developer.android.com

위의 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()해서 집어

넣었다.

 

느낀점 - 앞으로 뷰의 메소드들을 웬만하면 다 살펴보자.

반응형