In this post we are going to learn how to make custom change listeners. There are many use cases for custom change listeners like if you want to initiate some action when some variable’s value is changed. In PSLab android app, this was required during initialisation of PSLab hardware device, it takes about 3-4 seconds to initialise the device which includes reading calibration data from device and process it. So before starting the initialisation process, app notifies user with the message, “Initialising Wait …” and after initialisation is done, user is notified with the message “Initialisation Completed”.
There might be other ways to accomplish this but I found making a custom change listener for boolean and trigger notifying user action on change of boolean value to be most organised way to do it.
Another way I can think of is to pass the fragment reference to the class constructor for which the object is to be made. And Views need to be made public for access from that object to change status after some work is done.
Let’s look at an example, we would change status in a fragment after some task in object instantiation is completed.
Implementation
Class with variable on which custom change listener is required:
Create a class and declare a variable for which you want to listen the value change to trigger some action. In this example we have created a InitializationVariable class and defined a boolean variable named initialised.
Define an interface inside the class and that’s where the trick lies. When you set/change the value of the variable through a function setVariable(boolean value) in this case, note that we are triggering the interface method too.
public class InitializationVariable { public boolean initialised = false; private onValueChangeListener valueChangeListener; public boolean isInitialised() { return initialised; } public void setVariable(boolean value) { initialised = value; if (valueChangeListener != null) valueChangeListener.onChange(); } public onValueChangeListener getValueChangeListener() { return valueChangeListener; } public void setValueChangeListener(onValueChangeListener valueChangeListener) { this.valueChangeListener = valueChangeListener; } public interface onValueChangeListener { void onChange(); } }
Create an object of above class in activity/fragment:
Create an object to the class we just made and attach onValueChangeListener to it. This example shows how it’s used in PSLab Android, you can use it anywhere but remember to access view elements from a valid context.
public static InitializationVariable booleanVariable;
public class HomeFragment extends Fragment { @BindView(R.id.tv_initialisation_status) TextView tvInitializationStatus; public static InitializationVariable booleanVariable;// object whose value change is noted public static HomeFragment newInstance() { HomeFragment homeFragment = new HomeFragment(); return homeFragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.home_fragment, container, false); unbinder = ButterKnife.bind(this, view); return view; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); booleanVariable.setValueChangeListener(new InitializationVariable.onValueChangeListener() { @Override public void onChange() { if (booleanVariable.isInitialised()) tvInitializationStatus.setText("Initialsation Completed"); else tvInitializationStatus.setText("Initialising Wait ..."); } }); } }
Now whenever booleanVariable.setVariable(value) is called, it triggers the onValueChangeListener where you can manage the action you wanted to do on value change.
This is similar to how other listeners are implemented .You implement an interface and call those interface methods on some value change and classes which implement those interface have overridden methods which handle the action after change.
Hopefully this post gives you an insight about how change listeners are implemented.
Note: This post was specific to PSLab Android App, you can create custom change listener on any variable in any class and perform action on value of the variable getting changed.
Resources
- PSLab Android App
- Stackoverflow post to make listener for a custom variable
- Codepath guide on creating custom listeners