web-dev-qa-db-ja.com

RatingBar onClick

さまざまな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;
}
21
Andrew

setOnClickListener()が機能しない理由は、RatingBaronTouchEvent()をオーバーライドし(実際にはそのスーパークラスである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、ジョナス

59
jonasb

アンドリュー、RatingBarOnRatingBarChangeListenerで利用可能な別のイベントを使用してみてください。この例を参照してください、それは私のために働きます!

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {

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

したがって、onClickEventを使用する必要はありませんが、同じ効果がありますが、実際に値を変更した場合にのみ機能します。 (実際の値をクリックした場合、効果がない場合)

7
Tano
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
Rishi Paul

私は、RatingBarをLinearLayoutでラップし、onClickリスナーをLinearLayoutにアタッチすることで、この問題をハックしました。私はこれをするのが好きではありませんが、それは機能します。いくつかの不思議な理由で、onClickはRatingBarに対して実行されません。

5
Andrew

ListViewでは、通常、リストビューのアイテムをクリック可能にするか、リストビューに含まれるアイテムにするかを決定する必要があります。 r.isClickable()はtrueを返しますか?

RatingBarでclickableをfalseに設定し、代わりにlistViewのonClickListenerを使用して、listView行のクリックイベントを処理する方が幸運かもしれません。

1
Cheryl Simon