1. 程式人生 > >RadioGroup呼叫check(id)方法時,onCheckedChanged方法被執行多次解決辦法

RadioGroup呼叫check(id)方法時,onCheckedChanged方法被執行多次解決辦法

RadioGroup bottomMenuBar = (RadioGroup) findViewById(R.id.bottomMenuBar);
bottomMenuBar.setOnCheckedChangeListener(this);
bottomMenuBar.check(R.id.tab_new);
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
LogUtil.info(TAG, "onCheckedChanged invoked");
		
}
上面的程式碼塊很簡單,就不解釋了,RadioGroup是比較常用的控制元件,常用在單項選擇效果中。

上面程式碼,我給RadioGroup設定了一個選中改變監聽器(RadioGroup.OnCheckedChangeListener),然後呼叫它的check(id)方法,選中其中一個RadioButton,後面一段是監聽回撥方法,我簡單的做了一個log列印處理。

執行程式時,發現onCheckedChanged invoked被列印了兩次,也就是說回撥方法被呼叫了兩次:



這明顯是我不希望看到的效果,例如我選中某一項,然後做網路請求操作,這種場景下,就會觸發兩次網路請求,我當然不希望這種情況發生。

如何解決:

我嘗試了一些辦法,最終決定放棄給RadioGroup設定onCheckedChangedListener這種方式來監聽RadioButton的選中事件,而是給每個RadioButton都設定OnClickListener方法來實現,效果還是不錯的,可以解決問題。但感覺不爽,心想這明明是個RadioButton,卻要用click事件來監聽它的選中,總感覺很彆扭(看來我有輕微的強迫症,哈哈)。

這裡別看了,重點在下一段

本來打算就這麼做算了,反正能實現效果。後來有一天閒著沒事,又想到了這個問題,心中還是覺得很彆扭,於是去百度,谷歌了一下,百度真心沒有谷歌強,雖然只是搜個問題而已,不足以說明什麼哈,我百度了很久,沒收穫,然後寄希望於谷歌,真沒讓我失望,同樣的問題,複製黏貼到谷歌,搜了一次,還真找到了一些解決思路。

在stackoverflow中找到一個,請點這裡,他這個問題是呼叫三次,不過沒關係,最終想要的效果都是讓它只調用一次。

從文中得知一個思路,Call b.setChecked(true); instead.  試了一下,的確可以解決,將上面程式碼中的check方法刪掉用:

((RadioButton) bottomMenuBar.findViewById(R.id.tab_new)).setChecked(true);

執行程式,看log,onCheckedChanged方法只調用了一次:



完。