2012-04-21 16 views
19

Tôi đã đấu tranh với một vấn đề kiểm tra có lập trình của RadioButton, nằm trong RadioGroup. Dường như một cuộc gọi check() đơn lẻ tăng ba sự kiện - một lần cho RadioButton đầu tiên và hai lần cho lần thứ hai, đó là mục tiêu của tôi. Đồng thời nhấp vào RadioButton thứ hai trong giao diện chỉ khiến một sự kiện xuất hiện, điều đó là đúng.RadioGroup gọi onCheckChanged() ba lần

Vì vậy, có cách nào để tránh tăng nhiều sự kiện không?

public class RadiogroupActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     RadioGroup r = (RadioGroup) findViewById(R.id.radioGroup1); 
     RadioButton b = (RadioButton) findViewById(R.id.radio1); 
     r.setOnCheckedChangeListener(onPromobuttonsClick); 
     r.check(R.id.radio1); 

    } 

    private OnCheckedChangeListener onPromobuttonsClick = new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
      Log.d("x", "x"); 
     } 
    }; 
} 

Trả lời

39

Vì vậy, có cách nào để tránh tăng nhiều sự kiện không?

Gọi b.setChecked(true); thay thế.


Một cái nhìn nhanh qua source code khẳng định rằng RadioGroup#check() thực sự gọi OnCheckChangedListener ba lần ...

  1. Khi lựa chọn hiện nay là kiểm soát,
  2. Khi RadioButton mới được chọn, và
  3. Khi RadioGroup lưu RadioButton nào hiện được chọn.

.

+0

Sir: Cần giúp đỡ của bạn .Take một cái nhìn xin http://stackoverflow.com/questions/22602559/how-do- thực hiện-this-in-android –

+1

Thực sự đã cứu mạng tôi ... Tuyệt vời @Sam –

+0

Vui lòng giải thích chi tiết hơn. Tôi không nhận được câu trả lời của bạn. –

2

Chỉ cần đăng dòng r.setOnCheckedChangeListener(onPromobuttonsClick); của bạn theo phương thức onResume(). Nó có tác dụng với tôi.

0

Vì vậy, đây là hình ảnh cũ nhưng tôi cũng có hành vi tương tự. Một giải pháp mà tôi đã tìm thấy là gọi phương thức toggle() của RadioButton thay vì phương thức check() của RadioGroup.

Vì vậy, trong ví dụ này, bạn woulod chỉ cần trao đổi

r.check(R.id.radio1); 

với

b.toggle(); 

từ b đã là quan điểm với id R.id.radio1.

0

Tôi gặp sự cố này khi tôi muốn ghi nhật ký cho máy nén nút radio nhưng cách gọi nhóm radio được xử lý với .check() gây ra onCheckedChangeListener để gọi nhiều lần (đã gửi quá nhiều sự kiện).

tôi xử lý nó theo cách sau để chỉ nhận được một sự kiện cho mỗi nhấp chuột:

// create listeners so we don't duplicate the creation in for loop 
View.OnClickListener onClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // whatever you want to do here 
    } 
}; 

// add on click listener to all radio buttons 
int buttonCount = buttonGroup.getChildCount(); 
for (int i = 0; i < buttonCount; i++) { 
    if (buttonGroup.getChildAt(i) instanceof RadioButton) { 
     buttonGroup.getChildAt(i).setOnClickListener(onClickListener); 
    } 
} 
Các vấn đề liên quan