我ratingBar在使用Java 设置自定义时遇到问题.问题是,setNumStars并且setRating不起作用.虽然我已经将速率设置为0.0f,但我只是在屏幕上看到一个完全标记的星.
这是代码:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
chapter1 = new Chapter(this);
android.widget.RelativeLayout.LayoutParams layoutParam = new RelativeLayout.LayoutParams(metrics.widthPixels , metrics.heightPixels);
myLayout.addView(chapter1, layoutParam);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
RatingBar ratingBar = new RatingBar(this);
ratingBar.setProgressDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.custom_ratingbar_menu, null));
ratingBar.setNumStars(3);
ratingBar.setRating(0.0f);
layoutParam = new RelativeLayout.LayoutParams(metrics.widthPixels / 6 , metrics.heightPixels / 32);
layoutParam.setMargins(70 + chapter1.getLeft() + wSize * j, 50 + chapter1.getTop() + hSize * i + (metrics.heightPixels / 6), 0, 0);
myLayout.addView(ratingBar, layoutParam);
}
}
Run Code Online (Sandbox Code Playgroud)
我们已经用在公认的答案如何在Android中创建自定义评级酒吧为custom_ratingarbar_menu
这是custom_ratingbar_menu:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+android:id/background"
android:drawable="@drawable/customm_empty_menu" />
<item android:id="@android:id/secondaryProgress"
android:drawable="@drawable/customm_empty_menu" />
<item android:id="@android:id/progress"
android:drawable="@drawable/custom_full_menu" />
</layer-list>
Run Code Online (Sandbox Code Playgroud)
它是customm_empty_menu:
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:state_window_focused="true"
android:drawable="@drawable/stars_off_menu" />
<item android:state_focused="true"
android:state_window_focused="true"
android:drawable="@drawable/stars_off_menu" />
<item android:state_selected="true"
android:state_window_focused="true"
android:drawable="@drawable/stars_off_menu" />
<item android:drawable="@drawable/stars_off_menu" />
</selector>
Run Code Online (Sandbox Code Playgroud)
这是custom_full_menu:
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:state_window_focused="true"
android:drawable="@drawable/stars_on_menu" />
<item android:state_focused="true"
android:state_window_focused="true"
android:drawable="@drawable/stars_on_menu" />
<item android:state_selected="true"
android:state_window_focused="true"
android:drawable="@drawable/stars_on_menu" />
<item android:drawable="@drawable/stars_on_menu" />
</selector>
Run Code Online (Sandbox Code Playgroud)
编辑 在代码中设置可绘制进度存在一些问题。您的可绘制对象在 XML 中使用时可以工作。问题似乎围绕着设置适当的属性。如果我有时间,我可以进一步研究这个问题,或者也许其他人有想法。(检查您的 XML,有一个拼写错误:“customm”而不是“custom”。我已在下面更正它。)
(对于 API 级别 21 及更高级别,您可以执行以下操作:
在MainActivity.java中:
RatingBar ratingBar = new RatingBar(this, null, 0, R.style.myRatingBar);
Run Code Online (Sandbox Code Playgroud)
在 styles.xml 中:
<style name="myRatingBar" parent="@android:style/Widget.RatingBar">
<item name="android:progressDrawable">@drawable/custom_ratingbar_menu</item>
</style>
Run Code Online (Sandbox Code Playgroud)
但这不是通用解决方案,所以我更喜欢以下内容。)
同时,您可以通过RatingBar从 XML 扩充 a 并将其添加到布局而不是执行new RatingBar(this). 这样,您就可以利用 XML 文件中的属性。这解决了你的问题。
定义一个仅包含评级栏的 XML 布局文件,如下所示:
rating_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<RatingBar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/modelRatingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:progressDrawable="@drawable/custom_ratingbar_menu" />
Run Code Online (Sandbox Code Playgroud)
可绘制文件与您定义的一样。我使用不同的图标,因为我无权访问你的图标:
自定义评级栏菜单.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@android:id/background"
android:drawable="@drawable/custom_empty_menu" />
<item
android:id="@android:id/secondaryProgress"
android:drawable="@drawable/custom_empty_menu" />
<item
android:id="@android:id/progress"
android:drawable="@drawable/custom_full_menu">
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)
自定义_空_菜单.xml
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:state_window_focused="true"
android:drawable="@android:drawable/star_off" />
<item android:state_focused="true"
android:state_window_focused="true"
android:drawable="@android:drawable/star_off" />
<item android:state_selected="true"
android:state_window_focused="true"
android:drawable="@android:drawable/star_off" />
<item android:drawable="@android:drawable/star_off" />
</selector>
Run Code Online (Sandbox Code Playgroud)
自定义完整菜单.xml
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:state_window_focused="true"
android:drawable="@android:drawable/star_on" />
<item android:state_focused="true"
android:state_window_focused="true"
android:drawable="@android:drawable/star_on" />
<item android:state_selected="true"
android:state_window_focused="true"
android:drawable="@android:drawable/star_on" />
<item android:drawable="@android:drawable/star_on" />
</selector>
Run Code Online (Sandbox Code Playgroud)
最后,主要活动是onCreate():
MainActivity#onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
RelativeLayout myLayout = new RelativeLayout(this);
super.onCreate(savedInstanceState);
setContentView(myLayout);
// Your loop would go here...
RatingBar ratingBar = (RatingBar) getLayoutInflater()
.inflate(R.layout.rating_bar, myLayout, false);
myLayout.addView(ratingBar);
ratingBar.setNumStars(5);
ratingBar.setStepSize(0.5f);
ratingBar.setRating(2.0f);
}
Run Code Online (Sandbox Code Playgroud)
老答案,但仍然成立。
来自RatingBar的文档:
当布局宽度设置为 时,将显示设置的星数(通过 setNumStars(int) 或在 XML 布局中)
wrap_content(如果设置了另一个布局宽度,结果可能不可预测)。
您正在执行以下操作。(宽度和高度不是wrap_content。)
layoutParam = new RelativeLayout.LayoutParams(metrics.widthPixels / 6 , metrics.heightPixels / 32);
myLayout.addView(ratingBar, layoutParam);
Run Code Online (Sandbox Code Playgroud)
相反,执行以下操作可能会得到您想要的东西,或者至少得到您想要的星星数量。
layoutParam = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
myLayout.addView(ratingBar, layoutParam);
Run Code Online (Sandbox Code Playgroud)
我建议你暂时放弃进度drawable,直接获取星星数和评分,然后再引入drawable。
如果这不起作用,您可以发帖吗custom_ratingbar_menu?
| 归档时间: |
|
| 查看次数: |
766 次 |
| 最近记录: |