Получение значения 0.0 из ratingBar.getRating(); (Значение по умолчанию), даже если я изменил значение в строке рейтинга?

Я изучил это, но, похоже, не работает для меня. Я показываю рейтинг в диалоговом окне предупреждения. Я получаю значение только 0,0 при нажатии кнопки. Ниже приведен код:

rateme.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
android:id="@+id/ratingBar"
android:stepSize="1.0"/>
</LinearLayout>

Java.Code

 //Typecase
 final View view = this.getLayoutInflater().inflate(R.layout.rateme, null);
 ratingBar=(RatingBar)view.findViewById(R.id.ratingBar);

 AlertDialog.Builder alertDialog = null;
        alertDialog = new AlertDialog.Builder(this);
                alertDialog.setTitle("Rate and Review");
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        alertDialog.setView(R.layout.rateme);
    }else{
        alertDialog.setMessage("Please  Rate and Review");
    }
                alertDialog.setPositiveButton("SUBMIT", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        final String myPackage = getPackageName();
                        String value=" "+ratingBar.getRating();
                        Log.d(TAG," "+value);   **//Getting value 0.0 although I change  ratingbar and submit.**
                    }
                }).setNegativeButton("QUIT", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                }).setCancelable(true).setIcon(android.R.drawable.star_big_on).create();
    ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
        @Override
        public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
           //The toast below is not executed even when I chaned the ratingbar stars.
            Toast.makeText(Front.this, "Blank", Toast.LENGTH_SHORT).show();
            //Log.d(TAG,"Reached on Listener");
        }
    });
    alertDialog.show();
 }

Кажется, что я все сделал правильно, но я получаю значение 0.0 (константа). Что я мог ошибиться?

2 ответа

В чем дело

Вы раздуваете макет один раз, сохраняете ссылку на RatingBar, а затем забываете макет.

final View view = this.getLayoutInflater().inflate(R.layout.rateme, null);
ratingBar = (RatingBar)view.findViewById(R.id.ratingBar);
// You never work with view again.

Затем AlertDialog.Builder раздувает другой макет (на основе того же идентификатора ресурса), который фактически отображается.

alertDialog.setView(R.layout.rateme);

Как это исправить

Используйте макет, который вы надули.

final View view = this.getLayoutInflater().inflate(R.layout.rateme, null);
ratingBar = (RatingBar)view.findViewById(R.id.ratingBar);
alertDialog.setView(view);

Как это исправить еще дальше

Используйте контекст диалога (не контекст активности), чтобы ваш диалог рисовался правильно, когда у вас темная активность и вы хотите светлые диалоги.

final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
final LayoutInflater layoutInflater = LayoutInflater.from(alertDialog.getContext());
final View view = layoutInflater.inflate(R.layout.rateme, null);
ratingBar = (RatingBar)view.findViewById(R.id.ratingBar);
alertDialog.setView(view);

Всегда используйте самый близкий, самый логичный контекст, который вы можете получить при раздутии представлений.

Проблема лежит здесь

   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
       alertDialog.setView(R.layout.rateme);
   } else {
       alertDialog.setMessage("Please  Rate and Review");
   }

Вам не нужно это, если / иначе, так как setView был частью Android начиная с версии Api 1. С другой стороны, ваш рейтинг не совпадает с тем, что вы видите в диалоге, так как alertDialog.setView(R.layout.rateme); снова раздувает рейтинг. С помощью alertDialog.setView(view); должен исправить вашу проблему

Другие вопросы по тегам