经过写上篇文章Android闹钟最终版【android源码闹钟解析】 .发现有一些留邮箱的,但凡留邮箱的,我就发源码过去了,不错,基本上收到邮箱的都留言感谢了,这样我的成就感就多一点,也能有更多留邮箱的。学习是一个相互的过程,就像师说中“问道有先后,术业有专攻,仅此而已!”知识就是一层窗户纸,捅破了就没什么了,-------->个人浅薄的拙见,在这表达一下!


前段时间参加一个CMDN的讲座,讲的是Android主题,其中就有小米手机的UI工程师,董红光简单介绍了5中换肤的方法。所以就想简单练手一下,拿上个闹钟来换个背景试一试。好多应用都有更换自己应用壁纸的功能,例如熊猫看书就有这个功能,还有韩国的SKY手机,也可以更换mainmeun的背景,我也小试牛刀一下;


转载请标明出处:http://blog.csdn.net/wdaming1986/article/details/7479359


在做这个更换背景的大致思路如下:

(1)用ImageSwitcher来切换图片,效果就和更换手机系统的壁纸类似,下面有个gallery,滚动gallery,当gallery,选中哪个的时候,就用ImageSwitcher来切换与之对应的大的图片。

(2)SetBackGround extends Activity implements AdapterView.OnItemSelectedListener, ViewSwitcher.ViewFactory, OnClickListener。重写与之对应的方法。

(3)利用android提供的映射机制,当选中那个图片的时候,找到对应的gen下的R.java对应的16进制的值。

(4)用SharedPreferences保存这个id的值,下次进入这个程序,就可以取出来用了。就能永久保存了。


遇到的问题如下

(1)在DeskClockMainActivity.java中用startActivityForResult(intent, request);这个方法来启动SetBackGround.java这个类,当点击设置后,finish()这个SetBackGround类,传递给DeskClockMainActivity的onActivityResult()方法一个int的值。问题:startActivityForResult启动的时候,当SetBackGround这个类finish()的时候,onActivityResult()方法接受到的intent为空,resultCode==cancel,我就查资料,原来是DeskClockMainActivity的launcherMode=“singleInstance”导致的,它会启动一个新的栈,导致返回的时候不在一个栈中,传递intent传递不过去,我猜测是不同栈,intent回传的时候android有问题。修改方法,launcherMode=“singleTask”就可以了。详细参见api的startActivityForResult()介绍;

(2)SetBackGround设置背景的类有个button,当声明一个button类型的时候,像常规那样写:

button = (Button) findViewById(R.id.setButton_bg);这时候报错,说类型不匹配。解决办法有两种:1、把button声明为view类的对象,这样再像常规那样找id就不报错了。2、让类实现一个OnClickListener监听,通过:findViewById(R.id.setButton_bg).setOnClickListener(this);这样写就ok了,实现onClick(View v) 的点击方法就ok了。


先看效果图,如下:


点击图中画红圈的图片,进入换背景界面; 点击menu--->点击---->设置背景,


进入到更换背景的界面: 点击设置背景,即背景设成功



下面把主要的类贴出来,供大家参考:

一、DeskClockMainActivity.java类中的代码,这个是程序的入口类:

package com.cn.daming.deskclock;import java.util.Calendar;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.SharedPreferences;import android.database.Cursor;import android.graphics.Typeface;import android.os.Bundle;import android.preference.PreferenceManager;import android.util.Log;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.AdapterContextMenuInfo;import android.widget.AdapterView.OnItemClickListener;import android.widget.CheckBox;import android.widget.CursorAdapter;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;public class DeskClockMainActivity extends Activity implements OnItemClickListener{    static final String PREFERENCES = "AlarmClock";    /** This must be false for production.  If true, turns on logging,        test code, etc. */    static final boolean DEBUG = false;    private SharedPreferences mPrefs;    private LayoutInflater mFactory;    private ListView mAlarmsList;    private Cursor mCursor;    private LinearLayout mBglinearlayout;    private static final int REQ_SET_BG = 100;    private static final String SETBACKGROUND = "deskclock_bground";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                //取自定义布局的LayoutInflater        mFactory = LayoutInflater.from(this);        //取getSharedPreferences的实例        mPrefs = getSharedPreferences(PREFERENCES, 0);        //获取闹钟的cursor        mCursor = Alarms.getAlarmsCursor(getContentResolver());                //更新布局界面        updateLayout();    }    //加载更新界面布局    private void updateLayout() {    setContentView(R.layout.alarm_clock);    mBglinearlayout = (LinearLayout) findViewById(R.id.base_layout);        mAlarmsList = (ListView) findViewById(R.id.alarms_list);        AlarmTimeAdapter adapter = new AlarmTimeAdapter(this, mCursor);        mAlarmsList.setAdapter(adapter);        mAlarmsList.setVerticalScrollBarEnabled(true);        mAlarmsList.setOnItemClickListener(this);        mAlarmsList.setOnCreateContextMenuListener(this);        View addAlarm = findViewById(R.id.add_alarm);        addAlarm.setOnClickListener(new View.OnClickListener() {                public void onClick(View v) {                    addNewAlarm();                }            });        // Make the entire view selected when focused.        addAlarm.setOnFocusChangeListener(new View.OnFocusChangeListener() {                public void onFocusChange(View v, boolean hasFocus) {                    v.setSelected(hasFocus);                }        });        ImageButton deskClock =                (ImageButton) findViewById(R.id.desk_clock_button);        deskClock.setOnClickListener(new View.OnClickListener() {                public void onClick(View v) {                /**                 * modify by wangxianming in 2012-4-17                 * enter the set background class SetBackGround                 * author:wangxianming                 */                Intent intent = new Intent();                intent.setClass(DeskClockMainActivity.this, SetBackGround.class);                startActivityForResult(intent, REQ_SET_BG);                }        });    }        @Overrideprotected void onResume() {    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);    int setBgId = sharedPreferences.getInt(SETBACKGROUND, 0);    Log.v("wangxianming", "DeskClockMainActivity onResume() setBgId == "+setBgId);    if(setBgId != 0){    //设置背景 add by wangxianming in 2012-04-17    mBglinearlayout.setBackgroundResource(setBgId);    }super.onResume();}        private void addNewAlarm() {        startActivity(new Intent(this, SetAlarm.class));    }        /**     * listview的适配器继承CursorAdapter     * @author wangxianming     * 也可以使用BaseAdapter     */    private class AlarmTimeAdapter extends CursorAdapter {        public AlarmTimeAdapter(Context context, Cursor cursor) {            super(context, cursor);        }        public View newView(Context context, Cursor cursor, ViewGroup parent) {            View ret = mFactory.inflate(R.layout.alarm_time, parent, false);            DigitalClock digitalClock =                    (DigitalClock) ret.findViewById(R.id.digitalClock);            digitalClock.setLive(false);            return ret;        }        //把view绑定cursor的每一项        public void bindView(View view, Context context, Cursor cursor) {            final Alarm alarm = new Alarm(cursor);            View indicator = view.findViewById(R.id.indicator);            // Set the initial resource for the bar image.            final ImageView barOnOff =                    (ImageView) indicator.findViewById(R.id.bar_onoff);            barOnOff.setImageResource(alarm.enabled ?                    R.drawable.ic_indicator_on : R.drawable.ic_indicator_off);            // Set the initial state of the clock "checkbox"            final CheckBox clockOnOff =                    (CheckBox) indicator.findViewById(R.id.clock_onoff);            clockOnOff.setChecked(alarm.enabled);            // Clicking outside the "checkbox" should also change the state.            //对checkbox设置监听,使里外一致            indicator.setOnClickListener(new OnClickListener() {                    public void onClick(View v) {                        clockOnOff.toggle();                        updateIndicatorAndAlarm(clockOnOff.isChecked(),                                barOnOff, alarm);                    }            });            DigitalClock digitalClock =                    (DigitalClock) view.findViewById(R.id.digitalClock);            // set the alarm text            final Calendar c = Calendar.getInstance();            c.set(Calendar.HOUR_OF_DAY, alarm.hour);            c.set(Calendar.MINUTE, alarm.minutes);            digitalClock.updateTime(c);            digitalClock.setTypeface(Typeface.DEFAULT);            // Set the repeat text or leave it blank if it does not repeat.            TextView daysOfWeekView =                    (TextView) digitalClock.findViewById(R.id.daysOfWeek);            final String daysOfWeekStr =                    alarm.daysOfWeek.toString(DeskClockMainActivity.this, false);            if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {                daysOfWeekView.setText(daysOfWeekStr);                daysOfWeekView.setVisibility(View.VISIBLE);            } else {                daysOfWeekView.setVisibility(View.GONE);            }            // Display the label            TextView labelView =                    (TextView) view.findViewById(R.id.label);            if (alarm.label != null && alarm.label.length() != 0) {                labelView.setText(alarm.label);                labelView.setVisibility(View.VISIBLE);            } else {                labelView.setVisibility(View.GONE);            }        }    };        //更新checkbox    private void updateIndicatorAndAlarm(boolean enabled, ImageView bar,            Alarm alarm) {        bar.setImageResource(enabled ? R.drawable.ic_indicator_on                : R.drawable.ic_indicator_off);        Alarms.enableAlarm(this, alarm.id, enabled);        if (enabled) {            SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,                    alarm.daysOfWeek);        }    }        /*     * (non-Javadoc)     * @see android.app.Activity#onContextItemSelected(android.view.MenuItem)     * 创建上下文菜单     */    @Override    public boolean onContextItemSelected(final MenuItem item) {        final AdapterContextMenuInfo info =                (AdapterContextMenuInfo) item.getMenuInfo();        final int id = (int) info.id;        // Error check just in case.        if (id == -1) {            return super.onContextItemSelected(item);        }        switch (item.getItemId()) {            case R.id.delete_alarm:                // Confirm that the alarm will be deleted.                new AlertDialog.Builder(this)                        .setTitle(getString(R.string.delete_alarm))                        .setMessage(getString(R.string.delete_alarm_confirm))                        .setPositiveButton(android.R.string.ok,                                new DialogInterface.OnClickListener() {                                    public void onClick(DialogInterface d,                                            int w) {                                        Alarms.deleteAlarm(DeskClockMainActivity.this, id);                                    }                                })                        .setNegativeButton(android.R.string.cancel, null)                        .show();                return true;            case R.id.enable_alarm:                final Cursor c = (Cursor) mAlarmsList.getAdapter()                        .getItem(info.position);                final Alarm alarm = new Alarm(c);                Alarms.enableAlarm(this, alarm.id, !alarm.enabled);                if (!alarm.enabled) {                    SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,                            alarm.daysOfWeek);                }                return true;            case R.id.edit_alarm:                Intent intent = new Intent(this, SetAlarm.class);                intent.putExtra(Alarms.ALARM_ID, id);                startActivity(intent);                return true;            default:                break;        }        return super.onContextItemSelected(item);    }        /*     * (non-Javadoc)     * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo)     * 创建菜单     */    @Override    public void onCreateContextMenu(ContextMenu menu, View view,            ContextMenuInfo menuInfo) {        // Inflate the menu from xml.        getMenuInflater().inflate(R.menu.context_menu, menu);        // Use the current item to create a custom view for the header.        final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;        final Cursor c =                (Cursor) mAlarmsList.getAdapter().getItem((int) info.position);        final Alarm alarm = new Alarm(c);        // Construct the Calendar to compute the time.        final Calendar cal = Calendar.getInstance();        cal.set(Calendar.HOUR_OF_DAY, alarm.hour);        cal.set(Calendar.MINUTE, alarm.minutes);        final String time = Alarms.formatTime(this, cal);        // Inflate the custom view and set each TextView's text.        final View v = mFactory.inflate(R.layout.context_menu_header, null);        TextView textView = (TextView) v.findViewById(R.id.header_time);        textView.setText(time);        textView = (TextView) v.findViewById(R.id.header_label);        textView.setText(alarm.label);        // Set the custom view on the menu.        menu.setHeaderView(v);        // Change the text based on the state of the alarm.        if (alarm.enabled) {            menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);        }    }        /*     * (non-Javadoc)     * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)     * 设置菜单的点击事件的处理     */    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {            case R.id.menu_item_settings:                startActivity(new Intent(this, SettingsActivity.class));                return true;            case R.id.menu_item_alarm_set_bg:            /**             * modify by wangxianming in 2012-4-17             * enter the set background class SetBackGround             * author:wangxianming             */                startActivityForResult((new Intent(this, SetBackGround.class)), REQ_SET_BG);                return true;            case R.id.menu_item_add_alarm:                addNewAlarm();                return true;            default:                break;        }        return super.onOptionsItemSelected(item);    }    /*     * (non-Javadoc)     * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)     * 创建菜单     */    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.alarm_list_menu, menu);        return super.onCreateOptionsMenu(menu);    }        /*     * (non-Javadoc)     * @see android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView, android.view.View, int, long)     * 创建菜单的点击事件响应     */public void onItemClick(AdapterView<?> adapterView, View v, int pos, long id) {Intent intent = new Intent(this, SetAlarm.class);        intent.putExtra(Alarms.ALARM_ID, (int) id);        startActivity(intent);}   @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {   SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);   SharedPreferences.Editor editor = sharedPreferences.edit();   if(resultCode != RESULT_OK) {   return;   }   if(requestCode == REQ_SET_BG) {   switch(resultCode) {         case RESULT_OK:         Bundle b = data.getExtras();         int id = b.getInt("getDrawable");         editor.putInt(SETBACKGROUND, id);         editor.commit();         if(0 != id) {         //设置背景         mBglinearlayout.setBackgroundResource(id);         }         Log.v("wangxianming", "DeskClockMainActivity onActivityResult()----> id == "+id);         break;         default:         break;   }   }super.onActivityResult(requestCode, resultCode, data);}    @Override    protected void onDestroy() {        super.onDestroy();        ToastMaster.cancelToast();        mCursor.close();    }}


二、SetBackGround.java类中的代码,这个是设置背景图片的类:

package com.cn.daming.deskclock;import java.util.Calendar;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.SharedPreferences;import android.database.Cursor;import android.graphics.Typeface;import android.os.Bundle;import android.preference.PreferenceManager;import android.util.Log;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.AdapterContextMenuInfo;import android.widget.AdapterView.OnItemClickListener;import android.widget.CheckBox;import android.widget.CursorAdapter;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;public class DeskClockMainActivity extends Activity implements OnItemClickListener{    static final String PREFERENCES = "AlarmClock";    /** This must be false for production.  If true, turns on logging,        test code, etc. */    static final boolean DEBUG = false;    private SharedPreferences mPrefs;    private LayoutInflater mFactory;    private ListView mAlarmsList;    private Cursor mCursor;    private LinearLayout mBglinearlayout;    private static final int REQ_SET_BG = 100;    private static final String SETBACKGROUND = "deskclock_bground";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                //取自定义布局的LayoutInflater        mFactory = LayoutInflater.from(this);        //取getSharedPreferences的实例        mPrefs = getSharedPreferences(PREFERENCES, 0);        //获取闹钟的cursor        mCursor = Alarms.getAlarmsCursor(getContentResolver());                //更新布局界面        updateLayout();    }    //加载更新界面布局    private void updateLayout() {    setContentView(R.layout.alarm_clock);    mBglinearlayout = (LinearLayout) findViewById(R.id.base_layout);        mAlarmsList = (ListView) findViewById(R.id.alarms_list);        AlarmTimeAdapter adapter = new AlarmTimeAdapter(this, mCursor);        mAlarmsList.setAdapter(adapter);        mAlarmsList.setVerticalScrollBarEnabled(true);        mAlarmsList.setOnItemClickListener(this);        mAlarmsList.setOnCreateContextMenuListener(this);        View addAlarm = findViewById(R.id.add_alarm);        addAlarm.setOnClickListener(new View.OnClickListener() {                public void onClick(View v) {                    addNewAlarm();                }            });        // Make the entire view selected when focused.        addAlarm.setOnFocusChangeListener(new View.OnFocusChangeListener() {                public void onFocusChange(View v, boolean hasFocus) {                    v.setSelected(hasFocus);                }        });        ImageButton deskClock =                (ImageButton) findViewById(R.id.desk_clock_button);        deskClock.setOnClickListener(new View.OnClickListener() {                public void onClick(View v) {                /**                 * modify by wangxianming in 2012-4-17                 * enter the set background class SetBackGround                 * author:wangxianming                 */                Intent intent = new Intent();                intent.setClass(DeskClockMainActivity.this, SetBackGround.class);                startActivityForResult(intent, REQ_SET_BG);                }        });    }        @Overrideprotected void onResume() {    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);    int setBgId = sharedPreferences.getInt(SETBACKGROUND, 0);    Log.v("wangxianming", "DeskClockMainActivity onResume() setBgId == "+setBgId);    if(setBgId != 0){    //设置背景 add by wangxianming in 2012-04-17    mBglinearlayout.setBackgroundResource(setBgId);    }super.onResume();}        private void addNewAlarm() {        startActivity(new Intent(this, SetAlarm.class));    }        /**     * listview的适配器继承CursorAdapter     * @author wangxianming     * 也可以使用BaseAdapter     */    private class AlarmTimeAdapter extends CursorAdapter {        public AlarmTimeAdapter(Context context, Cursor cursor) {            super(context, cursor);        }        public View newView(Context context, Cursor cursor, ViewGroup parent) {            View ret = mFactory.inflate(R.layout.alarm_time, parent, false);            DigitalClock digitalClock =                    (DigitalClock) ret.findViewById(R.id.digitalClock);            digitalClock.setLive(false);            return ret;        }        //把view绑定cursor的每一项        public void bindView(View view, Context context, Cursor cursor) {            final Alarm alarm = new Alarm(cursor);            View indicator = view.findViewById(R.id.indicator);            // Set the initial resource for the bar image.            final ImageView barOnOff =                    (ImageView) indicator.findViewById(R.id.bar_onoff);            barOnOff.setImageResource(alarm.enabled ?                    R.drawable.ic_indicator_on : R.drawable.ic_indicator_off);            // Set the initial state of the clock "checkbox"            final CheckBox clockOnOff =                    (CheckBox) indicator.findViewById(R.id.clock_onoff);            clockOnOff.setChecked(alarm.enabled);            // Clicking outside the "checkbox" should also change the state.            //对checkbox设置监听,使里外一致            indicator.setOnClickListener(new OnClickListener() {                    public void onClick(View v) {                        clockOnOff.toggle();                        updateIndicatorAndAlarm(clockOnOff.isChecked(),                                barOnOff, alarm);                    }            });            DigitalClock digitalClock =                    (DigitalClock) view.findViewById(R.id.digitalClock);            // set the alarm text            final Calendar c = Calendar.getInstance();            c.set(Calendar.HOUR_OF_DAY, alarm.hour);            c.set(Calendar.MINUTE, alarm.minutes);            digitalClock.updateTime(c);            digitalClock.setTypeface(Typeface.DEFAULT);            // Set the repeat text or leave it blank if it does not repeat.            TextView daysOfWeekView =                    (TextView) digitalClock.findViewById(R.id.daysOfWeek);            final String daysOfWeekStr =                    alarm.daysOfWeek.toString(DeskClockMainActivity.this, false);            if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {                daysOfWeekView.setText(daysOfWeekStr);                daysOfWeekView.setVisibility(View.VISIBLE);            } else {                daysOfWeekView.setVisibility(View.GONE);            }            // Display the label            TextView labelView =                    (TextView) view.findViewById(R.id.label);            if (alarm.label != null && alarm.label.length() != 0) {                labelView.setText(alarm.label);                labelView.setVisibility(View.VISIBLE);            } else {                labelView.setVisibility(View.GONE);            }        }    };        //更新checkbox    private void updateIndicatorAndAlarm(boolean enabled, ImageView bar,            Alarm alarm) {        bar.setImageResource(enabled ? R.drawable.ic_indicator_on                : R.drawable.ic_indicator_off);        Alarms.enableAlarm(this, alarm.id, enabled);        if (enabled) {            SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,                    alarm.daysOfWeek);        }    }        /*     * (non-Javadoc)     * @see android.app.Activity#onContextItemSelected(android.view.MenuItem)     * 创建上下文菜单     */    @Override    public boolean onContextItemSelected(final MenuItem item) {        final AdapterContextMenuInfo info =                (AdapterContextMenuInfo) item.getMenuInfo();        final int id = (int) info.id;        // Error check just in case.        if (id == -1) {            return super.onContextItemSelected(item);        }        switch (item.getItemId()) {            case R.id.delete_alarm:                // Confirm that the alarm will be deleted.                new AlertDialog.Builder(this)                        .setTitle(getString(R.string.delete_alarm))                        .setMessage(getString(R.string.delete_alarm_confirm))                        .setPositiveButton(android.R.string.ok,                                new DialogInterface.OnClickListener() {                                    public void onClick(DialogInterface d,                                            int w) {                                        Alarms.deleteAlarm(DeskClockMainActivity.this, id);                                    }                                })                        .setNegativeButton(android.R.string.cancel, null)                        .show();                return true;            case R.id.enable_alarm:                final Cursor c = (Cursor) mAlarmsList.getAdapter()                        .getItem(info.position);                final Alarm alarm = new Alarm(c);                Alarms.enableAlarm(this, alarm.id, !alarm.enabled);                if (!alarm.enabled) {                    SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,                            alarm.daysOfWeek);                }                return true;            case R.id.edit_alarm:                Intent intent = new Intent(this, SetAlarm.class);                intent.putExtra(Alarms.ALARM_ID, id);                startActivity(intent);                return true;            default:                break;        }        return super.onContextItemSelected(item);    }        /*     * (non-Javadoc)     * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo)     * 创建菜单     */    @Override    public void onCreateContextMenu(ContextMenu menu, View view,            ContextMenuInfo menuInfo) {        // Inflate the menu from xml.        getMenuInflater().inflate(R.menu.context_menu, menu);        // Use the current item to create a custom view for the header.        final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;        final Cursor c =                (Cursor) mAlarmsList.getAdapter().getItem((int) info.position);        final Alarm alarm = new Alarm(c);        // Construct the Calendar to compute the time.        final Calendar cal = Calendar.getInstance();        cal.set(Calendar.HOUR_OF_DAY, alarm.hour);        cal.set(Calendar.MINUTE, alarm.minutes);        final String time = Alarms.formatTime(this, cal);        // Inflate the custom view and set each TextView's text.        final View v = mFactory.inflate(R.layout.context_menu_header, null);        TextView textView = (TextView) v.findViewById(R.id.header_time);        textView.setText(time);        textView = (TextView) v.findViewById(R.id.header_label);        textView.setText(alarm.label);        // Set the custom view on the menu.        menu.setHeaderView(v);        // Change the text based on the state of the alarm.        if (alarm.enabled) {            menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);        }    }        /*     * (non-Javadoc)     * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)     * 设置菜单的点击事件的处理     */    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {            case R.id.menu_item_settings:                startActivity(new Intent(this, SettingsActivity.class));                return true;            case R.id.menu_item_alarm_set_bg:            /**             * modify by wangxianming in 2012-4-17             * enter the set background class SetBackGround             * author:wangxianming             */                startActivityForResult((new Intent(this, SetBackGround.class)), REQ_SET_BG);                return true;            case R.id.menu_item_add_alarm:                addNewAlarm();                return true;            default:                break;        }        return super.onOptionsItemSelected(item);    }    /*     * (non-Javadoc)     * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)     * 创建菜单     */    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.alarm_list_menu, menu);        return super.onCreateOptionsMenu(menu);    }        /*     * (non-Javadoc)     * @see android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView, android.view.View, int, long)     * 创建菜单的点击事件响应     */public void onItemClick(AdapterView<?> adapterView, View v, int pos, long id) {Intent intent = new Intent(this, SetAlarm.class);        intent.putExtra(Alarms.ALARM_ID, (int) id);        startActivity(intent);}   @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {   SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);   SharedPreferences.Editor editor = sharedPreferences.edit();   if(resultCode != RESULT_OK) {   return;   }   if(requestCode == REQ_SET_BG) {   switch(resultCode) {         case RESULT_OK:         Bundle b = data.getExtras();         int id = b.getInt("getDrawable");         editor.putInt(SETBACKGROUND, id);         editor.commit();         if(0 != id) {         //设置背景         mBglinearlayout.setBackgroundResource(id);         }         Log.v("wangxianming", "DeskClockMainActivity onActivityResult()----> id == "+id);         break;         default:         break;   }   }super.onActivityResult(requestCode, resultCode, data);}    @Override    protected void onDestroy() {        super.onDestroy();        ToastMaster.cancelToast();        mCursor.close();    }}


【说明】有Android闹钟最终版【android源码闹钟解析】代码的,可以参照我的代码修改一下;

当然如果没有代码的:

(一)想要源码的可以留下邮箱,我看到后就给你发过去!

(二)也可以到我的csdn资源中下载:http://download.csdn.net/detail/wdaming1986/4240708

更多相关文章

  1. Android样式的开发:selector篇
  2. 摄像头Camera视频源数据采集解析
  3. 【iOS-cocos2d-X 游戏开发之十六】配置你的Cocos2dx项目编译后的
  4. 实现类似Android的网格效果的列表视图
  5. 翻译:Tutorial1:透明面板(LinearLayout)定义
  6. [置顶] Android(安卓)通知栏Notification的整合 全面学习 (一个DE
  7. 如何跳过Nexus 7二代的开机设置
  8. Android底部菜单(Fragment控制切换多个页面)
  9. Android--设置软键盘的显示和隐藏

随机推荐

  1. android XML文件常用字符转义
  2. Android中kotlin的学习(anko + kotlin)
  3. android 适配全面屏手机
  4. Android查看电池电量的方法(基于Broadcas
  5. android 开发错误点滴积累--Asset资源管
  6. [android]android5大基础组件深入分析
  7. Android Studio 圆形头像带边框的
  8. Android之文件搜索工具类
  9. android SDK下载加速
  10. Android 方法调用堆栈信息显示