Рейтинг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;
}
Ответы
Ответ 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.