1

으로 상태를 업데이트하지 않을 때 switch.setOnCheckedChangeListener를 건너 뛰는 방법 저는 처음으로 스위치를 (안드로이드에 대한 새로운) 시도하고 있기 때문에이 문제를 어떻게 처리해야할지 모르겠습니다. 나는 활동에 대한 스위치와 이에 붙어있는 setOnCheckedChangeListener()를 가지고있다. 액티비티의 oncreate가 호출되면 데이터베이스에 비동기 호출을하고 수신 된 값에 따라 스위치 상태를 설정/해제합니다. 이제 문제는 내가 스위치 상태를 db에 대한 현재 상태를 표시하도록 설정 했으므로 사용자가 아직 변경하지 않았지만 여전히 listner 함수가 호출된다는 것입니다. 코드가 올바르게 작동하고 있지만 상태가 변경된 listner와 함께 상태가 사용자에 의해 변경되었음을 확인하는 다른 것이 필요하다는 것을 알고 있습니다. 나는 onTouchEvent (MotionEvent 이벤트) 목적을 채울 수 있지만 switch.setOnCheckedChangeListener와 결합하여 뜨거운 알고 모르겠다 생각합니다.사용자가

누구든지 더 나은 솔루션을 알고 또는 atleast도 함께 ontouch 사용하는 방법을 말할 수 있습니다. 표제어 ...

sw_recording_switch.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    }} 

감사합니다 !!!

답변

4

실제로 초기화를 수행 한 후에

@Override 
public void onCheckedChanged(RadioGroup rg, int checkId) { 
    switch (rg.getId()) { 
     case R.id.rgMileKilometer: 
      switch (checkId) { 
       // process the speed radio group 
       case R.id.rdoMiles: 
        // Speed Radio Group check if the mph button is checked 
        isMile = true; 
        break; 
       case R.id.rdoKilometer: 
        isMile = false; 
        // Speed Radio Group check if the mph button is checked 
        break; 
      } 
      if (isResumed()) { 
       //do something the code is ready... 
      } 
    } 
} 

은 청취자를 추가; OnCheckedChangeListener도 트리거됩니다. 이 문제를 극복하는 방법은 플래그를 사용하여 setChecked()를 호출하기 전에 false로 설정하는 것입니다.

프로그래밍 방식으로 setChecked()를 사용하지만 내부 코드가 실행되지 않으면이 방식으로 청취자가 계속 호출됩니다. 사용자가 스위치를 누르지 않는 한.

//prevent the code from listener to run, flag set to false before calling setChecked(true); 
    should_run = false; 
    toggle_facebook.setChecked(true); 

    .... 

    private OnCheckedChangeListener onSwitchSlided = new OnCheckedChangeListener() 
    { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
     { 
      switch(buttonView.getId()) 
      { 
       case R.id.settings_toggle_facebook: 
       { 
        if(true == should_run) 
        { 
         //do stuff 
        } 

        should_run = true; 
        break; 
       } 
       case R.id.settings_toggle_twitter: 
       { 
        if(true == should_run) 
        { 
         //do stuff 
        } 

        should_run = true; 
        break; 
       } 
      } 
     } 
    }; 
+0

감사합니다 @Goran ... 같은 방식으로 생각하고 있었고 방금 나가야한다고 확인했습니다 ... 내가 원하는대로 작동합니다 ... : D –

1

초기화 코드를 처리하는 두 가지 방법으로 처리기가 작동하지 않습니다.

핸들러가 초기화임을 인식하도록 디자인하십시오. 아래 예제에서는 isResumed()를 사용하여 코드가 초기화 중인지 확인합니다. 이것은 onResume보다 먼저 onCreate가 호출되기 때문에 효과적입니다. Switch.setChecked (부울)를 호출 할 때

CheckBox cb = (CheckBox) view 
      .findViewById(R.id.cbApplicationCacheTabs); 
    cb.setChecked(isApplicationCacheTabs); 
    cb.setOnCheckedChangeListener(this);