0

For some reason my app crashes on launch.. heres all the code and debug output. It seems to me it's something with how I am using setOnCheckedChangeListener..

Debug output:

02-12 05:12:03.048: E/AndroidRuntime(1464): FATAL EXCEPTION: main
02-12 05:12:03.048: E/AndroidRuntime(1464): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dugley.check.in/com.dugley.check.in.MainActivity}: java.lang.ClassCastException: com.dugley.check.in.MainActivity cannot be cast to android.widget.CompoundButton$OnCheckedChangeListener
02-12 05:12:03.048: E/AndroidRuntime(1464):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at android.os.Looper.loop(Looper.java:137)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at android.app.ActivityThread.main(ActivityThread.java:5039)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at java.lang.reflect.Method.invokeNative(Native Method)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at java.lang.reflect.Method.invoke(Method.java:511)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at dalvik.system.NativeStart.main(Native Method)
02-12 05:12:03.048: E/AndroidRuntime(1464): Caused by: java.lang.ClassCastException: com.dugley.check.in.MainActivity cannot be cast to android.widget.CompoundButton$OnCheckedChangeListener
02-12 05:12:03.048: E/AndroidRuntime(1464):     at com.dugley.check.in.MainActivity.onCreate(MainActivity.java:21)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at android.app.Activity.performCreate(Activity.java:5104)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
02-12 05:12:03.048: E/AndroidRuntime(1464):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)

Main_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Switch
        android:id="@+id/switch1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_marginBottom="30dp"
        android:text="Service"/>

</RelativeLayout>

MainActivity.java:

package com.dugley.check.in;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Switch;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Switch s = (Switch) findViewById(R.id.switch1);

        if (s != null) {
            s.setOnCheckedChangeListener((OnCheckedChangeListener) this);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        Toast.makeText(this, "The Switch is " + (isChecked ? "on" : "off"),
                       Toast.LENGTH_SHORT).show();
        if(isChecked) {
            //do stuff when Switch is ON
        } else {
            //do stuff when Switch if OFF
        }
    }

}
4

5 回答 5

4

you need to add implements OnCheckedChangeListener with your MainActivity

I made your code working, See below....

public class MainActivity extends Activity implements OnCheckedChangeListener{//Changed

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Switch s = (Switch) findViewById(R.id.switch1);

    if (s != null) {
        s.setOnCheckedChangeListener(this); // Changed
    }
}
于 2013-02-12T05:20:17.280 回答
1

Your app crashes because you are casting your listener callback to your activity. This is not the way to implement callbacks in android.

Try this.

public class MainActivity extends Activity implements OnCheckedChangeListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Switch s = (Switch) findViewById(R.id.switch1);

        if (s != null) {
            s.setOnCheckedChangeListener(this);    // note this
        }
    }

    @override                                    // take a note
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        Toast.makeText(this, "The Switch is " + (isChecked ? "on" : "off"),
                       Toast.LENGTH_SHORT).show();
        if(isChecked) {
            //do stuff when Switch is ON
        } else {
            //do stuff when Switch if OFF
        }
    }
}
于 2013-02-12T05:21:20.780 回答
0

all you want is just

1 implement

 implement OnCheckedChangeListener

2 change

 s.setOnCheckedChangeListener((OnCheckedChangeListener) this);

to

    s.setOnCheckedChangeListener(this);
于 2013-02-12T05:26:34.523 回答
0

Switch inherits CompoundButton's attributes, so I would recommend the OnCheckedChangeListener

mySwitch.setOnCheckedChangeListener(new OnCheckedChangedListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // Do Something
    }
});
于 2013-02-12T05:28:00.863 回答
0
class MainActivity : AppCompatActivity() {
private var switchCompat: SwitchCompat? = null
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setupView()
    }

    private fun setupView(){
        switchCompat = findViewById(R.id.switch_compat)
        switchCompat?.setOnCheckedChangeListener { buttonView, isChecked ->
            Toast.makeText(this, ""+isChecked, Toast.LENGTH_SHORT).show()
        }
    }
}
于 2019-06-05T08:23:27.850 回答