需要一些帮助来实现/了解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.数据不能保持轮换。
您认为可能是什么问题?
答案 0 :(得分:1)
- 它显示的恒星数量超过恒星数量。超过5
醇>
来自文档的引用:
设置的星数(通过setNumStars(int)或XML布局) 将布局宽度设置为包装内容(如果是另一个)时将显示 布局宽度设置,结果可能无法预测。)
来源:http://developer.android.com/reference/android/widget/RatingBar.html
- 数据无法保持轮换。
醇>
旋转屏幕时,会调用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