Monday, May 25, 2015

ANDROID : Toogle button with Customised OnCkeckedChangeListner

The CompoundButton.OnCheckedChangeListener is using for creating  callback to be invoked when the checked state of a compound button changed. It can be assign to any view class inheriting the CompoundButton class.

       But i found a problem when using this interface with  view Adapters. The problem is if we set a callback for getting the checked change state to a ToggleButton ,  we can't understand the callback is fired when the user touches the screen or by changing the checked state by code .

Consider the code Below:

ToggleButton toogle = (ToggleButton) findViewById(R.id.btnId);
toogle.setOnCheckedChangeListener(new OnCheckedChangeListener() {
   
   @Override
   public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    
    //
   }
  });


So when the user changed the state of toggleButton by taping in it , the onCheckedChanged will fired.

ToggleButton toogle = (ToggleButton) findViewById(R.id.btnId);
It is also possible to do the same by this


toogle.setChecked(true);

So we cant understand the callback is fired by the user or by the ToogleButton class.


I have solved this issue by creating a custom callBack option for The ToggleButton.  And i am blessed if anyone found this post is helpful :) .

ToggleButtonWithExtendedCallback.java


package com.raspberry.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ToggleButton;

/*********************************************************************
 *
 * Toogle button with extended options in  OnCkeckedChange callback
 * to identify the checked change state is initiated by user , or
 * by programmatically.
 *
 * @author Name: JITHINRAJ.P
 * @author Url: https://in.linkedin.com/pub/jithin-raj/97/5b4/14a
 * @author Email : jithinrajktd@gmail.com
 *********************************************************************/


public class ToggleButtonWithExtendedCallback extends ToggleButton{

 private MyOnCkeckedChangeListner myOnCkeckedChangeListner;
 private boolean UP_FLAG;
 public ToggleButtonWithExtendedCallback(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
   UP_FLAG = true;
   break;
  case MotionEvent.ACTION_UP:
   if(UP_FLAG){
    super.toggle();
    if(myOnCkeckedChangeListner!= null)
     myOnCkeckedChangeListner.onChangedState(super.isChecked(), true);
    UP_FLAG = false;
   }
   break;

  default:
   break;
  }
  return true;
 }
 public void setMyOnCkeckedChangeListner(MyOnCkeckedChangeListner listner){
  this.myOnCkeckedChangeListner = listner;
 }
 public void setMyButtonChecked(boolean state){
  if(super.isChecked() == state){
   return;
  }
  else
  {
   super.setChecked(state);
   if(myOnCkeckedChangeListner!= null)
    myOnCkeckedChangeListner.onChangedState(super.isChecked(), false);
  }
 }
 public boolean getMyButtonState(){
  return super.isChecked();
 }
 public interface MyOnCkeckedChangeListner{
  public void onChangedState(boolean state , boolean isFromUser);
 }

}



Usage 

In layout 




Creating callback
    ToggleButtonWithExtendedCallback allarmtoogle = (ToggleButtonWithExtendedCallback)view.findViewById(R.id.alarmtoogle);

allarmtoogle.setMyOnCkeckedChangeListner(new MyOnCkeckedChangeListner() {
    
    @Override
    public void onChangedState(boolean state, boolean isFromUser) {
     
     
    }
   });

    

On the onChangedState callBack the boolean isFromUser indicating the callback is fired by user or by code.

To change the Checked state of toggleButton :

 
allarmtoogle.setMyButtonChecked(boolean);

No comments:

Post a Comment