RatingBar(レーティングバー)は飲食店の評価や本・アプリの評価でよく見る星の数というものです
Androidアプリでの設定はどうするのでしょうか
Android Studio
2024.1.1
2024.1.1
RatingBar
RatingBarはProgressBarとSeekBarを継承しているウィジェットの1つです
RatingBarで見つからない機能はProgressBarにあったりします
java.lang.Object | ||||
↳ | android.view.View | |||
↳ | android.widget.ProgressBar | |||
↳ | android.widget.AbsSeekBar | |||
↳ | android.widget.RatingBar |
設定は簡単にDesignのWidgetsから「RatingBar」を選んで設置できます
実際にユーザーが評価したレートを入れる操作を受け付けるようなスキームで
簡単なアプリを作ってみます
RatingBarのプロパティ
によればRatingBarとして以下のメソッドがあります
- isIndicator
- ユーザーにより変更可能かどうか
- numStars
- 評価レート、最大の星の数
- rating
- 初期のレート
- stepSize
- 評価ステップ、0.5だと星半分
また、ユーザーの評価変更を受け取って知らせるリスナーがあります
1 2 3 4 5 6 7 8 9 10 |
// 最新のレーティング値を取得 getRating() // 評価が変更されたことを知らせるリスナー public abstract void onRatingChanged (RatingBar ratingBar, float rating, boolean fromUser) // ratingBar: レーティングが変更したRatingBar // rating: 現在のレーティング // fromUser: ユーザーからの変更かどうか |
また、星の色を動的に変更するには
setProgressTintList()が使えます
1 |
ratingBar.setProgressTintList(ColorStateList.valueOf(Color.RED)); |
金色っぽくするために
Color.rgb(217, 194, 0)がいいかもしれません
サンプルコード
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
//package com.example.testratingbar; import android.os.Bundle; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import android.content.res.ColorStateList; import android.graphics.Color; import android.widget.RatingBar; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_main); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); TextView textView = findViewById(R.id.textview); RatingBar ratingBar = findViewById(R.id.ratingbar); // リスナー登録 ratingBar.setOnRatingBarChangeListener((ratingBar1, rating, fromUser) -> { // 現在の評価(星の数)を取得 //String str = "Rating: " + ratingBar1.getRating(); String str = "Rating: " + rating; // 評価をテキストビューに表示 textView.setText(str); // 星の色を変更してみる ratingBar.setProgressTintList(ColorStateList.valueOf(Color.rgb(217, 194, 0))); // 評価の変更は一度だけにする場合は↓をコメントイン //ratingBar.setIsIndicator(true); }); } } |
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/text" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.4" /> <RatingBar android:id="@+id/ratingbar" android:contentDescription="@string/ratingbar" android:isIndicator="false" android:numStars="5" android:rating="2.5" android:stepSize="0.5" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.6" /> </androidx.constraintlayout.widget.ConstraintLayout> |
stings.xml
1 2 3 4 5 |
<resources> <string name="app_name">YourAppName</string> <string name="text">ratingbar</string> <string name="ratingbar">ratingbar</string> </resources> |
これで実行してみます
activity_main.xml で設定した箇所は
コードで設定することも可能
1 2 3 4 5 6 7 8 |
// ユーザーにより変更可能かどうか、 false:可能、 true:変更不可 ratingBar.setIsIndicator(false); // 評価レート、最大の星の数 ratingBar.setNumStars(5); // 初期のレート ratingBar.setRating(2.5); // 評価ステップ、0.5だと星半分 ratingBar.setStepSize(0.5); |
References:
RatingBar | Android Developers
OnRatingBarChangeListener