我的问题是,当我再次评定相同的值时,它没有第二次响应。这意味着当我第一次评价'4'时,我不能评为'4'第二次......只有当我评价其他价值而不是'4'时,它才会响应。
以下是我尝试的内容(我需要在代码中getRatingBar
执行操作)。
public class InteractiveRatingBarActivity extends Activity implements
OnRatingBarChangeListener {
RatingBar getRatingBar;
RatingBar setRatingBar;
TextView countText;
int count;
float curRate;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewsById();
setRatingBar.setRating(curRate);//overall rating
getRatingBar.setOnRatingBarChangeListener(this);// ratingbar for user action.
}
private void findViewsById() {
getRatingBar = (RatingBar) findViewById(R.id.getRating);
setRatingBar = (RatingBar) findViewById(R.id.setRating);
countText = (TextView) findViewById(R.id.countText);
}
public void onRatingChanged(RatingBar rateBar, float rating,
boolean fromUser) {
DecimalFormat decimalFormat = new DecimalFormat("#.#");
curRate = Float.valueOf(decimalFormat.format((curRate * count + rating)
/ ++count));
Toast.makeText(InteractiveRatingBarActivity.this,
"New Rating: " + curRate, Toast.LENGTH_SHORT).show();
setRatingBar.setRating(curRate);
countText.setText(count + " Ratings");
}
}
提前致谢
答案 0 :(得分:5)
这是因为您有OnRatingChange(如果它保持不变,您的评级不会改变,因此不会调用此方法)。
您可以开发OnTouchListen:
ratingBar.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
float touchPositionX = event.getX();
float width = ratingBar.getWidth();
float starsf = (touchPositionX / width) * 5.0f;
int stars = (int) starsf + 1;
DecimalFormat decimalFormat = new DecimalFormat("#.#");
curRate = Float.valueOf(decimalFormat.format((curRate
* count + starsf)
/ ++count));
Toast.makeText(InteractiveRatingBarActivity.this,
"New Rating: " + curRate, Toast.LENGTH_SHORT)
.show();
setRatingBar.setRating(curRate);
countText.setText(count + " Ratings");
v.setPressed(false);
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
v.setPressed(true);
}
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
v.setPressed(false);
}
return true;
}
});
答案 1 :(得分:1)
当评级栏发生变化时,你可以调用onRatingChanged()方法。当你点击两次相同的速率时,它可能不会改变速率条,所以onRatingChanged()里面的函数可以不被调用。另一种可能的方法是在之后调用oncreate 每个onRatingChanged()都被调用..但它不应该在评级栏中显示以前的费率。
更新:
假设你在onRatingChanged()
内做的任何事情被包装成一个函数processing()
。在这里,您最需要的是更改的评级。所以我们将它作为参数传递给函数。尝试以下方式
float newRating;
myRatingBar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
newRating=myRatingBar.getRating();
processing(newRating);
}
});