java.lang.ClassCastException

时间:2011-12-27 11:30:49

标签: android

12-27 16:57:11.711:E / AndroidRuntime(22081):引起:java.lang.ClassCastException:com.mygps.android.AlarmReceiver。

这是我在logcat中的一个错误。什么是错误,我该如何解决它。

示例代码:

public class MainActivity extends Activity {
        private int currentIntervalChoice = 0;

    @Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        setAppInfo();
        addButtonListeners();
        enableControls();
    }

        private void addButtonListeners() {
                ((Button)findViewById(R.id.start_logging)).setOnClickListener(btnClick);
                    ((Button)findViewById(R.id.logging_interval)).setOnClickListener(btnClick);
        }

        private void setAppInfo() {
                TextView txtInfo = (TextView)findViewById(R.id.app_info);

        txtInfo.setText(Html.fromHtml(getString(R.string.app_info)));

        Linkify.addLinks(txtInfo, Linkify.ALL);
        }

        private void toggleLogging(boolean isStart, int interval){
                AlarmManager manager =   (AlarmManager)getSystemService(Service.ALARM_SERVICE);
            PendingIntent loggerIntent = PendingIntent.getBroadcast(this, 0,new Intent(this,AlarmReceiver.class), 0);

            if(isStart){
                    manager.cancel(loggerIntent);

                    AppSettings.setServiceRunning(this, false);

                    AppLog.logString("Service Stopped.");
            }
            else{
                    setLogFileName();

                    long duration = interval * 60 * 1000;

                    manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                                    SystemClock.elapsedRealtime(), duration, loggerIntent);

                    AppSettings.setServiceRunning(this, true);

                    AppLog.logString("Service Started with interval " + interval + ", Logfile name: " + AppSettings.getLogFileName(this));
            }
    }

    private void enableControls(){
            boolean isServiceRunning = AppSettings.getServiceRunning(this);
            String buttonText = getString(R.string.start_logging);

            if(isServiceRunning){
                    buttonText = getString(R.string.stop_logging);

                    ((Button)findViewById(R.id.logging_interval)).setEnabled(false);
            }
            else{
                    ((Button)findViewById(R.id.logging_interval)).setEnabled(true);
            }

            ((Button)findViewById(R.id.start_logging)).setText(buttonText);
    }

    private void changeLoggingIntercal(){
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            final String loggingIntervals[] = { "5 minutes", "15 minutes", "30 minutes", "1 hour" }; 

    builder.setTitle(getString(R.string.logging_interval));
    builder.setSingleChoiceItems(loggingIntervals, currentIntervalChoice, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                            currentIntervalChoice = which;

                            setLoggingInterval(currentIntervalChoice);

                            dialog.dismiss();
                    }
            });

    builder.show();
    }

    private void setLoggingInterval(int intervalChoice){
            int interval = 5;

            switch(intervalChoice){
                    case 0:         interval = 5;   break;
                    case 1:         interval = 15;  break;
                    case 2:         interval = 30;  break;
                    case 3:         interval = 60;  break;
                    default:        interval = 5;   break;
            }

            AppSettings.setLoggingInterval(this, interval);
    }

    public void setLogFileName(){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = sdf.format(new Date());
            String filename = "GPSLog." + dateString + ".kml";

            AppSettings.setLogFileName(this, filename);
    }

    private View.OnClickListener btnClick = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    switch(v.getId())
                    {
                            case R.id.start_logging:{
                                    toggleLogging(AppSettings.getServiceRunning(MainActivity.this), 
                                                              AppSettings.getLoggingInterval(MainActivity.this));

                                    enableControls();       

                                    break;
                            }
                            case R.id.logging_interval:{
                                    changeLoggingIntercal();

                                    break;
                            }
                    }
            }
    };

}

main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dip">


    <TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_horizontal"
    android:id="@+id/app_info"
    android:layout_weight="1.0"/>

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:padding="10dip">

    <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/start_logging"
            android:text="@string/start_logging"
            android:layout_weight="1.0"/>

    <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/logging_interval"
            android:text="@string/logging_interval"
            android:layout_weight="1.0"/>

</LinearLayout>

logfile.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:padding="10dip">


    <EditText
        android:id="@+id/edit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="Enter log filename here." />

2 个答案:

答案 0 :(得分:0)

请发布与此关联的xml布局文件和完整的logcat。我的建议,尽管这可能无关紧要,但是停止使用引用控件的((Button)findViewById(R.id.logging_interval))方法并使用变量。我之所以这么说,是因为我看到了这个错误,当时android将此解释为尝试重铸和吓坏了

答案 1 :(得分:0)

在清单文件中添加警报接收器类

<receiver android:name=".AlarmReceiver"> 
   <intent-filter> 
   <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter>   
</receiver>

我认为按钮的问题

在onCreate()中获取按钮,然后使用您需要的那些按钮..