How to use switch statements with the ‘onCheckedChanged’ method in android?
I’ve been trying to get it to work for years, and I want it so I can put two checkedChanged in one OnCheckedChanged method. What I have so far doesn’t work, but as I only had one case before, no switch statement works. Could you please take a look at my code and see how I can fix it to make it work?
The code is as follows:
public class MainActivity extends Activity implements OnClickListener, OnCheckedChangeListener {
Button sensorButton;
Button newScreen;
Switch vibrateToggle;
Switch lightsToggle;
NotificationManager nm1;
NotificationManager nm2;
static final int uniqueID1 = 12345;
static final int uniqueID2 = 54321;
OnCheckedChangeListener vibrateListener;
OnCheckedChangeListener lightsListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorButton = (Button)this.findViewById(R.id.sensorButton);
sensorButton.setOnClickListener(this);
newScreen = (Button)this.findViewById(R.id.newScreen);
newScreen.setOnClickListener(this);
nm1 = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
nm1.cancel(uniqueID1);
nm2 = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
nm2.cancel(uniqueID2);
vibrateToggle = (Switch)this.findViewById(R.id.switch1);
vibrateToggle.setOnCheckedChangeListener(vibrateListener);
lightsToggle = (Switch)this.findViewById(R.id.lightSwitch);
lightsToggle.setOnCheckedChangeListener(lightsListener);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
TODO Auto-generated method stub
switch(buttonView.getId()){
case R.id.switch1:
Toast.makeText(this, "Vibrate Notification is " + (isChecked ? " ON" : "OFF"),
Toast.LENGTH_SHORT).show();
if (isChecked) {
The toggle is enabled
Intent vibrateIntent = new Intent(this, MainActivity.class);
PendingIntent vibratePi = PendingIntent.getActivity(this, 0, vibrateIntent, 0);
NotificationCompat.Builder vibrateN = new NotificationCompat.Builder(this);
vibrateN.setContentIntent(vibratePi);
vibrateN.setDefaults(Notification.DEFAULT_VIBRATE);
Notification vn = vibrateN.build();
nm2.notify(uniqueID2, vn);
} else {
The toggle is disabled
}
case R.id.lightSwitch:
Toast.makeText(this, "Lights Notification is " + (isChecked ? " ON" : "OFF"),
Toast.LENGTH_SHORT).show();
if (isChecked) {
The toggle is enabled
Intent lightsIntent = new Intent(this, MainActivity.class);
PendingIntent lightsPi = PendingIntent.getActivity(this, 0, lightsIntent, 0);
NotificationCompat.Builder lightsN = new NotificationCompat.Builder(this);
lightsN.setContentIntent(lightsPi);
lightsN.setDefaults(Notification.DEFAULT_LIGHTS);
Notification ln = lightsN.build();
nm2.notify(uniqueID2, ln);
} else {
The toggle is disabled
}
break;
}
}
Here’s what I got logcat:
03-14 16:46:21.139: D/dalvikvm(532): Not late-enabling CheckJNI (already on)
03-14 16:46:22.218: I/dalvikvm(532): threadid=3: reacting to signal 3
03-14 16:46:22.338: I/dalvikvm(532): Wrote stack traces to '/data/anr/traces.txt'
03-14 16:46:22.728: I/dalvikvm(532): threadid=3: reacting to signal 3
03-14 16:46:22.739: I/dalvikvm(532): Wrote stack traces to '/data/anr/traces.txt'
03-14 16:46:23.238: I/dalvikvm(532): threadid=3: reacting to signal 3
03-14 16:46:23.278: I/dalvikvm(532): Wrote stack traces to '/data/anr/traces.txt'
03-14 16:46:23.509: D/gralloc_goldfish(532): Emulator without GPU emulation detected.
03-14 16:46:25.258: D/AndroidRuntime(532): Shutting down VM
03-14 16:46:25.258: W/dalvikvm(532): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
03-14 16:46:25.288: E/AndroidRuntime(532): FATAL EXCEPTION: main
03-14 16:46:25.288: E/AndroidRuntime(532): java.lang.IllegalStateException: Could not find a method onSwitchToggle(View) in the activity class com.example.sensor.MainActivity for onClick handler on view class android.widget.Switch with id 'switch1'
03-14 16:46:25.288: E/AndroidRuntime(532): at android.view.View$1.onClick(View.java:3031)
03-14 16:46:25.288: E/AndroidRuntime(532): at android.view.View.performClick(View.java:3511)
03-14 16:46:25.288: E/AndroidRuntime(532): at android.widget.CompoundButton.performClick(CompoundButton.java:100)
03-14 16:46:25.288: E/AndroidRuntime(532): at android.view.View$PerformClick.run(View.java:14105)
03-14 16:46:25.288: E/AndroidRuntime(532): at android.os.Handler.handleCallback(Handler.java:605)
03-14 16:46:25.288: E/AndroidRuntime(532): at android.os.Handler.dispatchMessage(Handler.java:92)
03-14 16:46:25.288: E/AndroidRuntime(532): at android.os.Looper.loop(Looper.java:137)
03-14 16:46:25.288: E/AndroidRuntime(532): at android.app.ActivityThread.main(ActivityThread.java:4424)
03-14 16:46:25.288: E/AndroidRuntime(532): at java.lang.reflect.Method.invokeNative(Native Method)
03-14 16:46:25.288: E/AndroidRuntime(532): at java.lang.reflect.Method.invoke(Method.java:511)
03-14 16:46:25.288: E/AndroidRuntime(532): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-14 16:46:25.288: E/AndroidRuntime(532): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-14 16:46:25.288: E/AndroidRuntime(532): at dalvik.system.NativeStart.main(Native Method)
03-14 16:46:25.288: E/AndroidRuntime(532): Caused by: java.lang.NoSuchMethodException: onSwitchToggle [class android.view.View]
03-14 16:46:25.288: E/AndroidRuntime(532): at java.lang.Class.getConstructorOrMethod(Class.java:460)
03-14 16:46:25.288: E/AndroidRuntime(532): at java.lang.Class.getMethod(Class.java:915)
03-14 16:46:25.288: E/AndroidRuntime(532): at android.view.View$1.onClick(View.java:3024)
03-14 16:46:25.288: E/AndroidRuntime(532): ... 12 more
03-14 16:46:25.948: I/dalvikvm(532): threadid=3: reacting to signal 3
03-14 16:46:25.958: I/dalvikvm(532): Wrote stack traces to '/data/anr/traces.txt'
Solution
As shown in the log:
NoSuchMethodException: onSwitchToggle [class android.view.View]
Indicates that you added the android:onClick="onSwitchToggle"
attribute in the Switch
View xml, but you forgot to define the method in the activity
> code.
Since you are adding setOnCheckedChangeListener
() to the Switch
View in the activity, you do not need to set onClick()
in
the XML of the Switch
View. Simply remove the android:onClick="onSwitchToggle"
attribute from the XML.