setNumStars和setRating在自定义RatingBar中不起作用

Ary*_*ghi 5 java android

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)

Che*_*amp 4

编辑 在代码中设置可绘制进度存在一些问题。您的可绘制对象在 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