RatingBar onClick - PullRequest
       5

RatingBar onClick

21 голосов
/ 10 августа 2010

У меня есть ListView, который использует разные XML-файлы для создания представлений и создания элементов.Один из этих файлов XML содержит RatingBar.Все отображается и выглядит превосходно.

Я пытаюсь прикрепить обработчик onClick к RatingBar, чтобы запустить новое действие.Мой RatingBar имеет стиль? Android: attr / ratingBarStyleSmall;так что это всего лишь индикатор (я хочу, чтобы маленький щелчок RatingBar переместил пользователя в Activity, где он может делать различные оценки).

Моя проблема в том, что обработчик onClick для RatingBar никогда не выполняется.Что делает его более интересным, так это то, что я использовал тот же код, чтобы сделать LinearLayout кликабельным, и он отлично работает.Может кто-нибудь сказать мне, почему?

getView моего адаптера выглядит так:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    int type = getItemViewType(position);

    // get the View for this list item
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        switch (type) {
            // ...
            case TYPE_LOOKUP:
                v = vi.inflate(R.layout.layout_itemlist_itemlookup, parent, false);
                LinearLayout vLookup = (LinearLayout)v.findViewById(R.id.itemlist_lookup);
                if (vStore != null) {
                    vStore.setOnClickListener(new View.OnClickListener() {
                            public void onClick(View v) {
                                // THIS HANDLER WORKS FINE
                                Intent intentLaunchLookup = new Intent(ActivityItemList.this, ActivityLookup.class);
                                startActivity(intentLaunchLookup);
                            }
                        });
                }
                break;
            case TYPE_SEPARATOR:
                v = vi.inflate(R.layout.layout_itemlist_itemseparator, parent, false);
                RatingBar r = (RatingBar)v.findViewById(R.id.itemlist_rating);
                if (r != null) {
                    r.setOnClickListener(new View.OnClickListener() {
                            public void onClick(View v) {
                                // THIS HANDLER DOES NOT GET EXECUTED (r IS NOT NULL; SO THIS SHOULD HAVE BEEN CREATED)
                                Intent intentLaunchRating = new Intent(ActivityItemList.this, ActivityRating.class);
                                startActivity(intentLaunchRating);
                            }
                        });
                }
                break;
            // ...
        }
    }
    // …

  // return the created view
    return v;
}

Ответы [ 5 ]

57 голосов
/ 25 октября 2010

Причина того, что setOnClickListener() не работает, заключается в том, что RatingBar переопределяет onTouchEvent() (на самом деле его суперкласс, AbsSeekBar, делает) и никогда не позволяет View позаботиться об этом, поэтому View#performClick() никогда не вызывается (который бы назвал OnClickListener).

Два возможных обходных пути:

НТН, Jonas

7 голосов
/ 31 мая 2013

Эндрю, вы можете просто попробовать использовать другое событие, доступное для RatingBar , OnRatingBarChangeListener . Посмотрите на этот пример, он работает для меня!

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {

        @Override
        public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
            viewMarketDetails(mContext);
            dialog.dismiss();
        }
    });

Таким образом, вам не нужно использовать onClickEvent, но вы получаете тот же эффект, но работаете, конечно, только если вы действительно изменили значение. (Если вы нажмете на фактическое значение, если не имеет никакого эффекта)

5 голосов
/ 05 ноября 2014
ratingBar1.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {

        @Override
        public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {

            String rateValue = String.valueOf(ratingbar1.getRating());
            System.out.println("Rate for Module is"+rateValue);
        }
    });             
4 голосов
/ 11 августа 2010

Я решил эту проблему, обернув RatingBar в LinearLayout и подключив прослушиватель onClick к LinearLayout. Мне не нравится это делать, но это работает. По какой-то таинственной причине onClick не будет работать для RatingBar.

1 голос
/ 10 августа 2010

В ListView вы обычно должны решить, хотите ли вы, чтобы элементы представления списка были кликабельными, или элемент, содержащийся в представлении списка.R.isClickable () возвращает true?

Возможно, вам повезет больше, если вы установили clickable в false на RatingBar и вместо этого использовали onClickListener listView для обработки событий щелчка в строке listView.

...