为什么setOnCheckedChangeListener?导致崩溃?

时间:2013-02-12 05:15:21

标签: android uiswitch

出于某种原因,我的应用程序在启动时崩溃..继承了所有代码和调试输出。在我看来,这与我如何使用setOnCheckedChangeListener ..

有关

调试输出:

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
        }
    }

}

5 个答案:

答案 0 :(得分:4)

您需要在MainActivity

中添加implements OnCheckedChangeListener

我让你的代码工作,见下文......

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
    }
}

答案 1 :(得分:1)

您的应用崩溃了,因为您正在将监听器回调投射到您的活动中。 这不是在android中实现回调的方法。

试试这个。

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
        }
    }
}

答案 2 :(得分:0)

你想要的只是

1工具

 implement OnCheckedChangeListener

2改变

 s.setOnCheckedChangeListener((OnCheckedChangeListener) this);

    s.setOnCheckedChangeListener(this);

答案 3 :(得分:0)

Switch继承了CompoundButton的属性,因此我建议使用OnCheckedChangeListener

mySwitch.setOnCheckedChangeListener(new OnCheckedChangedListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // Do Something
    }
});

答案 4 :(得分: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()
        }
    }
}