Подтвердить что ты не робот

РейтингBar onClick

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

Я пытаюсь подключить обработчик onClick к RatingBar, чтобы запустить новое действие. Мой рейтингBar имеет стиль? 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;
}
4b9b3361

Ответ 1

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

Возможные обходные пути:

  • вытекает из
RatingBar и переопределяет onTouchEvent()
  • используйте
OnTouchListener вместо этого:
ratingBar.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            // TODO perform your action here
        }
        return true;
    }

НТН, Jonas

Ответ 2

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

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {

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

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

Ответ 3

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

Ответ 4

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);
        }
    });             

Ответ 5

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

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