Barra de clasificación personalizada en dispositivos de pan de jengibre

He creado un RatingBar personalizado, que puede tener 5 colores diferentes y tienen barra de rectángulo con puntos debajo de las estrellas. Así es como se ve:

Introduzca aquí la descripción de la imagen

Estoy utilizando esta vista en un par de lugares y todo está bien en Android 4.0 o superior. Pero en Gingerbread tengo algunos problemas. Aquí está el código para la clase view:

public class KrinsenRating extends RelativeLayout { private TextView mRanking; private RatingBar mStars; public KrinsenRating(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); layoutInflater.inflate(R.layout.krinsen_rating, this); loadViews(); } public KrinsenRating(Context context) { super(context); loadViews(); } private void loadViews() { mRanking = (TextView) findViewById(R.id.ranking_bar_position); mStars = (RatingBar) findViewById(R.id.ranking_bar); } public void setRating(long rating){ RatingConverter rc = new RatingConverter(rating); Bitmap bmp_empty = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_empty)).getBitmap(); Bitmap bmp_half = null; Bitmap bmp_full = null; switch (rc.getColor()) { case 1: bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half1)).getBitmap(); bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full1)).getBitmap(); mRanking.setBackgroundColor(getResources().getColor(R.color.ranking1)); break; case 2: bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half2)).getBitmap(); bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full2)).getBitmap(); mRanking.setBackgroundColor(getResources().getColor(R.color.ranking2)); break; case 3: bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half3)).getBitmap(); bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full3)).getBitmap(); mRanking.setBackgroundColor(getResources().getColor(R.color.ranking3)); break; case 4: bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half4)).getBitmap(); bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full4)).getBitmap(); mRanking.setBackgroundColor(getResources().getColor(R.color.ranking4)); break; case 5: bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half5)).getBitmap(); bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full5)).getBitmap(); mRanking.setBackgroundColor(getResources().getColor(R.color.ranking5)); break; } mStars.setProgressDrawable(GUI.buildRatingBarDrawables(new Bitmap[]{bmp_empty, bmp_half, bmp_full})); mStars.setRating(rc.getRealRating()); mRanking.setText(rating + ""); } } 

Esta línea es confusa: mStars.setProgressDrawable(GUI.buildRatingBarDrawables(new Bitmap[]{bmp_empty, bmp_half, bmp_full})); Pero tuve que tener esto, debido al problema en la prestación de estrellas después de la llamada setProgressDrawable() (sólo se muestra una estrella estirada). Aquí está el método buildRatingBarDrawables :

 public static Drawable buildRatingBarDrawables(Bitmap[] images) { final int[] requiredIds = { android.R.id.background, android.R.id.secondaryProgress, android.R.id.progress }; final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; Drawable[] pieces = new Drawable[3]; for (int i = 0; i < 3; i++) { ShapeDrawable sd = new ShapeDrawable(new RoundRectShape( roundedCorners, null, null)); BitmapShader bitmapShader = new BitmapShader(images[i], Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); sd.getPaint().setShader(bitmapShader); ClipDrawable cd = new ClipDrawable(sd, Gravity.LEFT, ClipDrawable.HORIZONTAL); if (i == 0) { pieces[i] = sd; } else { pieces[i] = cd; } } LayerDrawable ld = new LayerDrawable(pieces); for (int i = 0; i < 3; i++) { ld.setId(i, requiredIds[i]); } return ld; } 

Por lo tanto, todo está bien en Android ICS y más reciente, pero en Gingerbread tengo algunas situaciones extrañas. Primero de todo a veces en pan de jengibre todo está bien. Pero a menudo es que no hay estrellas en absoluto. Barra de rectángulo con puntos es siempre la derecha, pero las estrellas a veces desaparece. Aquí es por ejemplo la pantalla de ListView que utilizan la barra de la calificación en cada fila única:

Introduzca aquí la descripción de la imagen

Como se puede ver, a veces está bien, a veces no: / Tengo esta barra de calificación en mi navegación slidingMenu y hay estrellas se muestran cuando me deslice lentamente, pero después de la diapositiva es más (cuando onOpened debe ser llamada) las estrellas son sólo desaparecer.

¿Tienes algún pensamiento que me haga más feliz con eso?

He añadido el archivo xml para el diseño de calificación:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/avatar_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" > <RatingBar android:id="@+id/ranking_bar" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_centerHorizontal="true" android:clickable="false" android:focusable="false" android:isIndicator="true" android:numStars="3" android:progressDrawable="@drawable/krinsen_rating" android:stepSize="0.1" /> <TextView android:id="@+id/ranking_bar_position" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/ranking_bar" android:layout_centerHorizontal="true" android:contentDescription="@string/register_avatar" android:paddingBottom="2dp" android:paddingLeft="8dp" android:paddingRight="8dp" android:paddingTop="2dp" android:textColor="@android:color/white" android:textSize="14sp" android:textStyle="bold" /> </RelativeLayout> 

Sería un enfoque más fácil para definir sus calificaciones de calificación en una lista de capas dibujable y luego asignar a su clase RatingBar. Funciona para mí en android pan de jengibre y antes.

 <?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/star_empty" /> <item android:id="@+android:id/secondaryProgress" android:drawable="@drawable/star_empty" /> <item android:id="@+android:id/progress" android:drawable="@drawable/star_full" /> </layer-list> 

Guarde que en y archivo xml en la carpeta drawables, por ejemplo, myCustomRatingBarDrawable.xml

Luego en cualquier vista RatingBar:

 <RatingBar android:id="@+id/ratingbar" android:progressDrawable="@drawable/myCustomRatingBarDrawable" android:isIndicator="true" android:max="5" android:numStars="5" ... /> 
  • RatingBar: mismo rating dos veces
  • Android RatingBar se pinta mal
  • Android RatingBar mostrar recubrimiento negro en algunos dispositivos
  • Pequeña Custom RatingBar: Diseño de materiales
  • Android: cambia el color de la barra de calificación a oro
  • Cómo cambiar la clasificación de Android estrellas de la barra?
  • El tamaño del paso de la barra de clasificación no funciona en piruletas. Pero funciona en malvavisco
  • Personalizar la barra de calificación con diferentes imágenes personalizadas para cada estrella después de la selección
  • Custom RatingBar Muestra un número diferente de estrellas cuando api 23
  • Android Rating Bar muestra sólo estrellas completas, no media estrellas también
  • Android - Cómo configurar la barra de calificación no se puede hacer clic y se puede tocar en HTC móvil
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.