如何正确使用Android中的RatingBar?

时间:2014-06-10 19:23:21

标签: android ratingbar

需要一些帮助来实现/了解RatingBar的工作原理。

在我的活动中,我给我的xml充气,里面多次有一个RatingBar。像这样的东西。剥离版本是

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

View contentView = getLayoutInflater().inflate(R.layout.activity_main, null);
setContentView(contentView);
// there are other views here sooo had to do it this way.
ViewGroup ratingsContainer = (ViewGroup) findViewById(R.id.x11);
for(int i = 0 ; i < 5; i++){
    ratingsContainer.addView(createRatingBar(i)); 
}
}

private RatingBar createRatingBar(int index){
    RatingBar ratingBar = (RatingBar)getLayoutInflater().inflate(R.layout.ratingbar, null);
    ratingBar.setRating(index);
    return ratingBar;
}

我的评级栏xml

<RatingBar xmlns:android="http://schemas.android.com/apk/res/android"
                style="?android:attr/ratingBarStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:numStars="5"
                android:stepSize="1"/>

my activity_main

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
<LinearLayout 
    android:id="@+id/x11"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    </LinearLayout>    
    </LinearLayout>

但它似乎无法正常工作 它显示的恒星数量多于恒星数量。超过5 2.数据不能保持轮换。

您认为可能是什么问题?

2 个答案:

答案 0 :(得分:1)

  
      
  1. 它显示的恒星数量超过恒星数量。超过5
  2.   

来自文档的引用:

  

设置的星数(通过setNumStars(int)或XML布局)   将布局宽度设置为包装内容(如果是另一个)时将显示   布局宽度设置,结果可能无法预测。)

来源:http://developer.android.com/reference/android/widget/RatingBar.html

  
      
  1. 数据无法保持轮换。
  2.   

旋转屏幕时,会调用onCreate方法,重新创建它们。您可以使用onSaveInstanceState和onRestoreInstance状态来保存/恢复评级,也可以在activity_main.xml文件中通过XML添加它们,让Android为您执行此操作。

编辑: 宽度问题与null充气时使用layout有关 解决它:

ViewGroup ratingsContainer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        // there are other views here sooo had to do it this way.
        ratingsContainer = (ViewGroup) findViewById(R.id.x11);
        for (int i = 0; i < 5; i++) {
            ratingsContainer.addView(createRatingBar(i));
        }
    }

    private RatingBar createRatingBar(int index) {
        RatingBar ratingBar = (RatingBar) getLayoutInflater().inflate(
                R.layout.ratingbar, ratingsContainer, false);
        ratingBar.setRating(index);
        return ratingBar;
    }

有关为什么在充气here时不应该使用null的更多信息。

对于你的第二个问题(轮换):
您可以将RatingBars放在activity_main文件中,无需createRatingBar功能。

<LinearLayout
        android:id="@+id/x11"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <RatingBar
            android:id="@+id/rb1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:numStars="5"
            android:stepSize="1" />

        <RatingBar
            android:id="@+id/rb2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:numStars="5"
            android:stepSize="1" />
    </LinearLayout>

答案 1 :(得分:0)

  

数据无法保持轮换。

这是因为当方向改变时,活动/片段是新创建的。你必须存储状态 - 围绕www有很多好的答案。一个是这样的: Saving Android Activity state using Save Instance State