2014-12-05 35 views
1

我在我的應用程序中使用了CompoundButton。我在CompoundButton.OnCheckedChangeListeneronCheckedChange()回調中調用名爲newsLetterUpdate()的方法。我以編程方式更改了此CompoundButton的選中狀態,但onCheckedChange()回調被調用。我希望只有在View上切換選中狀態時纔會觸發onCheckedChange()。 請給我一個解決方案,以改變複合按鈕的狀態,而不需要調用onCheckedChange()回調。如何在不影響onCheckedChangeListener中的onCheckedChanged()的情況下以編程方式打開/關閉計算按鈕

+0

取一個標誌,並且當你以編程方式改變狀態複合按鈕時設置爲false,並在onCheckedChanged()基礎上檢查這個標誌值。 – 2014-12-05 06:43:00

回答

0

方法1:如果你想在checkChangeListener同時使用與視圖進行交互,然後implemenet onClickListenernewsLetterUpdate方法在該類

Mehtod 2只應調用:註銷監聽器之前,你programmaticaly改變複選框並在您完成後再次註冊

方法3:使用布爾標誌...設置它當您更改複選框時編程並設置爲false如果您完成... guard th e代碼與該標誌,你想執行用戶交互只

+0

它應該在checkChangeListener中使用newsLetterUpdate()方法。然後?? – 2014-12-05 07:44:03

+0

在你編程之前取消註冊監聽器複選框並在完成後再次註冊..使用布爾型標誌...當你更改複選框時進行編程設置,並且設置是否爲false,該標誌,你不想執行用戶交互只有 – 2014-12-05 07:51:20

2

因此,根據您的要求,我相信你只需要執行onCheckedChange()回調中的代碼,只有當用戶啓動的行動。對?

那你爲什麼要用onCheckedChange(),你可以用onClickListener()來代替你的目標。

目前你可能寫你的代碼中:

compundbutton.setOnCheckedChangeListener(your_current_listener);

此舉代碼從那裏到:

compundbutton.setOnClickListener(your_new_listener);

然後onCheckedChange()聽衆將不會在設置選中狀態programiccally調用。

compundbutton.setChecked(checked);

希望它可以幫助你..! :)

+0

我覺得,取消註冊和註冊監聽器,這種方法更有效率。謝謝 – 2014-12-31 07:09:02

0

方法4:使用自定義視圖

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.Switch; 

public class CustomSwitch extends Switch { 


    private OnCheckedChangeListener mListener; 

    public CustomSwitch(Context context) { 
     super(context); 
    } 

    public CustomSwitch(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { 
     // Do not call supper method 
     mListener = listener; 
    } 

    @Override 
    public void setChecked(boolean checked) { 
     super.setChecked(checked); 

     if (mListener != null) { 
      mListener.onCheckedChanged(this, checked); 
     } 
    } 

    public void setCheckedProgrammatically(boolean checked) { 
     // You can call super method, it doesn't have a listener... he he :) 
     super.setChecked(checked); 
    } 

} 

示例XML使用

<com.your.package.CustomSwitch 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

現在的想法是要調用的方法setCheckedProgrammatically代碼。 setChecked得到由Android當用戶改變複方按鈕

請注意,我使用一個開關,它擴展了複方按鈕的狀態叫,你基本上可以使用相同的代碼上的任何其他(複選框,.. )

1

我有類似的問題。我有RadioGroup,當用戶打開應用程序時,我設置了初始狀態,並且它在OnCheckedChangeListener中進行,在我的情況下是更新數據庫中非常糟糕的數據。我已經解決了它,在OnCheckedChangedListener我正在按鈕,並在該方法中設置一個OnClickListener:

viberPermissionView.getAppPermissions().setOnCheckedChangeListener(
     new RadioGroup.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(RadioGroup radioGroup, 
      int checkedRadioButtonId) { 
       final RadioButton checkedButton =  
      viberPermissionView.findViewById(checkedRadioButtonId); 
       checkedButton.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         startService(checkedButton, 
          App.VIBER); 
        } 
       }); 
      } 
     }); 

隨着那的onCreate被稱爲它打算在OnCheckedChangedListener時,但它不是在OnClickListener去。只有當用戶按下按鈕時,它纔會進入OnClick,並在我的情況下執行startService。希望這會有所幫助。

相關問題