2010-08-09 7 views
18

다른 XML 파일을 사용하여보기를 만들고 항목을 밖으로 내보내는 ListView가 있습니다. 이러한 XML 파일 중 하나에 RatingBar가 포함되어 있습니다. 모든 것이 표시되고 훌륭하게 보입니다.RatingBar onClick

나는 새로운 활동을 시작하기 위해 onClick 처리기를 RatingBar에 연결하려고합니다. 내 RatingBar 스타일의? android : attr/ratingBarStyleSmall; 그래서 그것은 단지 지표입니다 (저는 작은 RatingBar 클릭이 다양한 등급을 할 수있는 활동으로 사용자를 데려 가기를 원합니다).

내 문제는 RatingBar에 대한 onClick 처리기가 실행되지 않는다는 것입니다. 더 흥미로운 점은 동일한 코드를 사용하여 LinearLayout을 클릭 할 수있게 만들었고 정상적으로 작동한다는 것입니다. 아무도 그 이유를 말할 수 있습니까? 당신은 일반적으로 당신이 목록보기 항목을 클릭 할 것인지 결정해야한다, 또는 항목이 목록보기에 포함

@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; 
} 
+0

아무에게도 추가적인 의견이 있습니까? 나는 여전히 onClick 핸들러를 실행할 수 없다. 보시다시피, 나는 LinearLayout에 대해 동일한 코드를 사용하고 있으며 정상적으로 작동합니다. 내 RatingBar는 클릭 가능으로 설정됩니다. 나는 LinearLayout과 RatingBar 모두에 대해 onClick 리스너 내부에 중단 점을 설정하고 LinearLayout 핸들러 만 실행됩니다. 주 : RatingBar는 LinearLayout 내에 있지 않습니다. 보시다시피 두 개의 서로 다른 XML 파일에 있습니다. – Andrew

답변

53

setOnClickListener()가 작동하지 않는 이유는 너무 View#performClick()가합니다 (OnClickListener라고 한 것이다) 호출되지 않습니다, RatingBar 무시 onTouchEvent() (실제로는 슈퍼 클래스, AbsSeekBar는 않습니다) 결코 그것의 View 걸릴 치료를 할 수 있다는 것입니다.

두 가지 가능한 해결 방법 :

    지금처럼 RatingBar에서 파생 대신 onTouchEvent()
    사용 OnTouchListener를 오버라이드 (override) :
     
    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; 
        } 
    

HTH, 조나스

1

ListView가에서 :

내 어댑터의의 getView 같은 보인다. r.isClickable()이 true를 반환합니까?

RatingBar에서 clickable 설정을 false로 설정하고 listView의 onClickListener를 사용하여 listView 행의 click 이벤트를 처리하는 것이 더 나을 수도 있습니다.

+0

목록 항목 전체를 클릭 할 수 없도록하고 싶지만 목록 항목 내의 개별 항목을 클릭 할 수있게하고 싶습니다. LinearLayout 항목으로 이미이 작업을 수행했습니다. 코드는 정확히 같고 onClick 핸들러는 완벽하게 실행됩니다. 나는 왜 RatingBar가 그다지 이해하지 못한다. 이 순간을 반영하여 내 메인 포스트를 업데이트하겠습니다. – Andrew

4

LinearLayout에 RatingBar를 래핑하고 onClick 수신기를 LinearLayout에 연결하여이 문제를 해킹했습니다. 나는이 일을 좋아하지 않지만 효과적이다. 신비한 이유로 인해 onClick은 RatingBar에 대해 실행되지 않습니다.

5

앤드류, 당신은 단지 시도 할 수 있습니다 RatingB에서 다른 이벤트를 사용할 수 있습니다. ar, OnRatingBarChangeListener. 이 예제를 참조하십시오, 그것은 나를 위해 작동합니다!

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 

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

그래서 당신은 onClickEvent를 사용할 필요가 없습니다하지만 당신은 실제로 값을 변경하는 경우는, 오프 물론, 같은 효과,하지만 일이. (실제 값을 클릭하면 효과가없는 경우)

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