さまざまなXMLファイルを使用してビューを作成し、そこからアイテムを作成するListViewがあります。これらのXMLファイルの1つには、RatingBarが含まれています。すべてが表示され、見栄えがします。
OnClickハンドラーをRatingBarにアタッチして、新しいアクティビティを起動しようとしています。私のRatingBarのスタイルは?android:attr/ratingBarStyleSmall;したがって、これは単なる指標です(小さな評価バーをクリックして、ユーザーをさまざまな評価を実行できるアクティビティに移動させます)。
私の問題は、RatingBarのonClickハンドラーが実行されないことです。さらに興味深いのは、同じコードを使用して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;
}
setOnClickListener()
が機能しない理由は、RatingBar
がonTouchEvent()
をオーバーライドし(実際にはそのスーパークラスであるAbsSeekBar
は機能します)、View
はそれを処理するので、View#performClick()
は呼び出されません(OnClickListener
が呼び出されます)。
2つの可能な回避策:
RatingBar
から派生し、onTouchEvent()
をオーバーライドしますOnTouchListener
を使用してください:ratingBar.setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v、MotionEvent event){ if(event.getAction()= = MotionEvent.ACTION_UP){ // TODOはここでアクションを実行します } return true; }
HTH、ジョナス
アンドリュー、RatingBar、OnRatingBarChangeListenerで利用可能な別のイベントを使用してみてください。この例を参照してください、それは私のために働きます!
ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
viewMarketDetails(mContext);
dialog.dismiss();
}
});
したがって、onClickEventを使用する必要はありませんが、同じ効果がありますが、実際に値を変更した場合にのみ機能します。 (実際の値をクリックした場合、効果がない場合)
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);
}
});
私は、RatingBarをLinearLayoutでラップし、onClickリスナーをLinearLayoutにアタッチすることで、この問題をハックしました。私はこれをするのが好きではありませんが、それは機能します。いくつかの不思議な理由で、onClickはRatingBarに対して実行されません。
ListViewでは、通常、リストビューのアイテムをクリック可能にするか、リストビューに含まれるアイテムにするかを決定する必要があります。 r.isClickable()はtrueを返しますか?
RatingBarでclickableをfalseに設定し、代わりにlistViewのonClickListenerを使用して、listView行のクリックイベントを処理する方が幸運かもしれません。