闹钟源码解析


   

         以下是我发现的几点闹钟中重要的点,分享一下:

         (1)在闹钟中有AudioManager管理机制,这个机制可以申请和释放OnAudioFocusChangeListener监听。

还有mTelephonyManager对象,处理在闹钟响的时候,来电铃声的切换。

         (2)广播接收闹钟,通过广播启动AlarmKlaxon这个Service,隐式启动service:

public static final String ALARM_INTENT_EXTRA = "intent.extra.alarm";

[java]  view plain copy print ?
  1. // Play the alarm alert and vibrate the device.  
  2.         Intent playAlarm = new Intent(Alarms.ALARM_ALERT_ACTION);  
  3.         playAlarm.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);  
  4.         context.startService(playAlarm);  

   在mainfest中,AlarmKlaxon这个服务的定义如下:

[java]  view plain copy print ?
  1. <service android:name="AlarmKlaxon"  
  2.                 android:description="@string/alarm_klaxon_service_desc"  
  3.                 >  
  4.             <intent-filter>  
  5.                 <action android:name="com.cn.daming.deskclock.ALARM_ALERT" />  
  6.             </intent-filter>  
  7.         </service>  

这个service做的是允许别的Activity打断正在响铃的铃声,播放其他的铃声,例如,闹钟响的时候来电话了。

        (3)在listview中包含checkbox,这时候闹钟的处理时,activity实现一个OnItemClickListener的监听,点击每一项的监听。然后在checkbox单独拿出去写一个类,继承LinearLayout,重写setPressed()这个方法,以实现“当点击checkbox的时候不触发parent的click事件”。关键代码如下:

[java]  view plain copy print ?
  1. <span style="font-size:18px;"@Override  
  2.     public void setPressed(boolean pressed) {  
  3.         // If the parent is pressed, do not set to pressed.  
  4.         if (pressed && ((View) getParent()).isPressed()) {  
  5.             return;  
  6.         }  
  7.         super.setPressed(pressed);  
  8.     }</span>  

 

下面看看我的程序截图:

                    红色圈的图标为我的闹钟。                                         点击“玲闹钟”后的界面

                                  

                      点击新建闹钟出现的界面                                           设置好时间弹出的toast。

                                  

下面我把我的主要入口类的代码贴出来

DeskClockMainActivity.java

[java]  view plain copy print ?
  1. <span style="font-size:18px;">package com.cn.daming.deskclock;  
  2.   
  3. import java.util.Calendar;  
  4.   
  5. import android.app.Activity;  
  6. import android.app.AlertDialog;  
  7. import android.content.Context;  
  8. import android.content.DialogInterface;  
  9. import android.content.Intent;  
  10. import android.content.SharedPreferences;  
  11. import android.database.Cursor;  
  12. import android.graphics.Typeface;  
  13. import android.os.Bundle;  
  14. import android.view.LayoutInflater;  
  15. import android.view.Menu;  
  16. import android.view.MenuItem;  
  17. import android.view.View;  
  18. import android.view.ContextMenu;  
  19. import android.view.ContextMenu.ContextMenuInfo;  
  20. import android.view.View.OnClickListener;  
  21. import android.view.ViewGroup;  
  22. import android.widget.AdapterView;  
  23. import android.widget.AdapterView.AdapterContextMenuInfo;  
  24. import android.widget.AdapterView.OnItemClickListener;  
  25. import android.widget.CheckBox;  
  26. import android.widget.CursorAdapter;  
  27. import android.widget.ImageButton;  
  28. import android.widget.ImageView;  
  29. import android.widget.ListView;  
  30. import android.widget.TextView;  
  31.   
  32. public class DeskClockMainActivity extends Activity implements OnItemClickListener{  
  33.       
  34.     static final String PREFERENCES = "AlarmClock";  
  35.   
  36.     /** This must be false for production.  If true, turns on logging, 
  37.         test code, etc. */  
  38.     static final boolean DEBUG = false;  
  39.   
  40.     private SharedPreferences mPrefs;  
  41.     private LayoutInflater mFactory;  
  42.     private ListView mAlarmsList;  
  43.     private Cursor mCursor;  
  44.       
  45.     @Override  
  46.     public void onCreate(Bundle savedInstanceState) {  
  47.         super.onCreate(savedInstanceState);  
  48.           
  49.         //取自定义布局的LayoutInflater  
  50.         mFactory = LayoutInflater.from(this);  
  51.         //取getSharedPreferences中key==“AlarmClock”的值  
  52.         mPrefs = getSharedPreferences(PREFERENCES, 0);  
  53.         //获取闹钟的cursor  
  54.         mCursor = Alarms.getAlarmsCursor(getContentResolver());  
  55.           
  56.         //更新布局界面  
  57.         updateLayout();  
  58.   
  59.     }  
  60.       
  61.     //加载更新界面布局  
  62.     private void updateLayout() {  
  63.         setContentView(R.layout.alarm_clock);  
  64.         mAlarmsList = (ListView) findViewById(R.id.alarms_list);  
  65.         AlarmTimeAdapter adapter = new AlarmTimeAdapter(this, mCursor);  
  66.         mAlarmsList.setAdapter(adapter);  
  67.         mAlarmsList.setVerticalScrollBarEnabled(true);  
  68.         mAlarmsList.setOnItemClickListener(this);  
  69.         mAlarmsList.setOnCreateContextMenuListener(this);  
  70.   
  71.         View addAlarm = findViewById(R.id.add_alarm);  
  72.         addAlarm.setOnClickListener(new View.OnClickListener() {  
  73.                 public void onClick(View v) {  
  74.                     addNewAlarm();  
  75.                 }  
  76.             });  
  77.         // Make the entire view selected when focused.  
  78.         addAlarm.setOnFocusChangeListener(new View.OnFocusChangeListener() {  
  79.                 public void onFocusChange(View v, boolean hasFocus) {  
  80.                     v.setSelected(hasFocus);  
  81.                 }  
  82.         });  
  83.   
  84.         ImageButton deskClock =  
  85.                 (ImageButton) findViewById(R.id.desk_clock_button);  
  86.         deskClock.setOnClickListener(new View.OnClickListener() {  
  87.                 public void onClick(View v) {  
  88.                       
  89.                 }  
  90.         });  
  91.     }  
  92.       
  93.     private void addNewAlarm() {  
  94.         startActivity(new Intent(this, SetAlarm.class));  
  95.     }  
  96.       
  97.     /** 
  98.      * listview的适配器继承CursorAdapter 
  99.      * @author wangxianming 
  100.      * 也可以使用BaseAdapter 
  101.      */  
  102.     private class AlarmTimeAdapter extends CursorAdapter {  
  103.         public AlarmTimeAdapter(Context context, Cursor cursor) {  
  104.             super(context, cursor);  
  105.         }  
  106.   
  107.         public View newView(Context context, Cursor cursor, ViewGroup parent) {  
  108.             View ret = mFactory.inflate(R.layout.alarm_time, parent, false);  
  109.   
  110.             DigitalClock digitalClock =  
  111.                     (DigitalClock) ret.findViewById(R.id.digitalClock);  
  112.             digitalClock.setLive(false);  
  113.             return ret;  
  114.         }  
  115.   
  116.         //把view绑定cursor的每一项  
  117.         public void bindView(View view, Context context, Cursor cursor) {  
  118.             final Alarm alarm = new Alarm(cursor);  
  119.   
  120.             View indicator = view.findViewById(R.id.indicator);  
  121.   
  122.             // Set the initial resource for the bar image.  
  123.             final ImageView barOnOff =  
  124.                     (ImageView) indicator.findViewById(R.id.bar_onoff);  
  125.             barOnOff.setImageResource(alarm.enabled ?  
  126.                     R.drawable.ic_indicator_on : R.drawable.ic_indicator_off);  
  127.   
  128.             // Set the initial state of the clock "checkbox"  
  129.             final CheckBox clockOnOff =  
  130.                     (CheckBox) indicator.findViewById(R.id.clock_onoff);  
  131.             clockOnOff.setChecked(alarm.enabled);  
  132.   
  133.             // Clicking outside the "checkbox" should also change the state.  
  134.             //对checkbox设置监听,使里外一致  
  135.             indicator.setOnClickListener(new OnClickListener() {  
  136.                     public void onClick(View v) {  
  137.                         clockOnOff.toggle();  
  138.                         updateIndicatorAndAlarm(clockOnOff.isChecked(),  
  139.                                 barOnOff, alarm);  
  140.                     }  
  141.             });  
  142.   
  143.             DigitalClock digitalClock =  
  144.                     (DigitalClock) view.findViewById(R.id.digitalClock);  
  145.   
  146.             // set the alarm text  
  147.             final Calendar c = Calendar.getInstance();  
  148.             c.set(Calendar.HOUR_OF_DAY, alarm.hour);  
  149.             c.set(Calendar.MINUTE, alarm.minutes);  
  150.             digitalClock.updateTime(c);  
  151.             digitalClock.setTypeface(Typeface.DEFAULT);  
  152.   
  153.             // Set the repeat text or leave it blank if it does not repeat.  
  154.             TextView daysOfWeekView =  
  155.                     (TextView) digitalClock.findViewById(R.id.daysOfWeek);  
  156.             final String daysOfWeekStr =  
  157.                     alarm.daysOfWeek.toString(DeskClockMainActivity.thisfalse);  
  158.             if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {  
  159.                 daysOfWeekView.setText(daysOfWeekStr);  
  160.                 daysOfWeekView.setVisibility(View.VISIBLE);  
  161.             } else {  
  162.                 daysOfWeekView.setVisibility(View.GONE);  
  163.             }  
  164.   
  165.             // Display the label  
  166.             TextView labelView =  
  167.                     (TextView) view.findViewById(R.id.label);  
  168.             if (alarm.label != null && alarm.label.length() != 0) {  
  169.                 labelView.setText(alarm.label);  
  170.                 labelView.setVisibility(View.VISIBLE);  
  171.             } else {  
  172.                 labelView.setVisibility(View.GONE);  
  173.             }  
  174.         }  
  175.     };  
  176.       
  177.     //更新checkbox  
  178.     private void updateIndicatorAndAlarm(boolean enabled, ImageView bar,  
  179.             Alarm alarm) {  
  180.         bar.setImageResource(enabled ? R.drawable.ic_indicator_on  
  181.                 : R.drawable.ic_indicator_off);  
  182.         Alarms.enableAlarm(this, alarm.id, enabled);  
  183.         if (enabled) {  
  184.             SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,  
  185.                     alarm.daysOfWeek);  
  186.         }  
  187.     }  
  188.       
  189.     /* 
  190.      * (non-Javadoc) 
  191.      * @see android.app.Activity#onContextItemSelected(android.view.MenuItem) 
  192.      * 创建上下文菜单 
  193.      */  
  194.     @Override  
  195.     public boolean onContextItemSelected(final MenuItem item) {  
  196.         final AdapterContextMenuInfo info =  
  197.                 (AdapterContextMenuInfo) item.getMenuInfo();  
  198.         final int id = (int) info.id;  
  199.         // Error check just in case.  
  200.         if (id == -1) {  
  201.             return super.onContextItemSelected(item);  
  202.         }  
  203.         switch (item.getItemId()) {  
  204.             case R.id.delete_alarm:  
  205.                 // Confirm that the alarm will be deleted.  
  206.                 new AlertDialog.Builder(this)  
  207.                         .setTitle(getString(R.string.delete_alarm))  
  208.                         .setMessage(getString(R.string.delete_alarm_confirm))  
  209.                         .setPositiveButton(android.R.string.ok,  
  210.                                 new DialogInterface.OnClickListener() {  
  211.                                     public void onClick(DialogInterface d,  
  212.                                             int w) {  
  213.                                         Alarms.deleteAlarm(DeskClockMainActivity.this, id);  
  214.                                     }  
  215.                                 })  
  216.                         .setNegativeButton(android.R.string.cancel, null)  
  217.                         .show();  
  218.                 return true;  
  219.   
  220.             case R.id.enable_alarm:  
  221.                 final Cursor c = (Cursor) mAlarmsList.getAdapter()  
  222.                         .getItem(info.position);  
  223.                 final Alarm alarm = new Alarm(c);  
  224.                 Alarms.enableAlarm(this, alarm.id, !alarm.enabled);  
  225.                 if (!alarm.enabled) {  
  226.                     SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,  
  227.                             alarm.daysOfWeek);  
  228.                 }  
  229.                 return true;  
  230.   
  231.             case R.id.edit_alarm:  
  232.                 Intent intent = new Intent(this, SetAlarm.class);  
  233.                 intent.putExtra(Alarms.ALARM_ID, id);  
  234.                 startActivity(intent);  
  235.                 return true;  
  236.   
  237.             default:  
  238.                 break;  
  239.         }  
  240.         return super.onContextItemSelected(item);  
  241.     }  
  242.       
  243.     /* 
  244.      * (non-Javadoc) 
  245.      * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo) 
  246.      * 创建菜单 
  247.      */  
  248.     @Override  
  249.     public void onCreateContextMenu(ContextMenu menu, View view,  
  250.             ContextMenuInfo menuInfo) {  
  251.         // Inflate the menu from xml.  
  252.         getMenuInflater().inflate(R.menu.context_menu, menu);  
  253.   
  254.         // Use the current item to create a custom view for the header.  
  255.         final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;  
  256.         final Cursor c =  
  257.                 (Cursor) mAlarmsList.getAdapter().getItem((int) info.position);  
  258.         final Alarm alarm = new Alarm(c);  
  259.   
  260.         // Construct the Calendar to compute the time.  
  261.         final Calendar cal = Calendar.getInstance();  
  262.         cal.set(Calendar.HOUR_OF_DAY, alarm.hour);  
  263.         cal.set(Calendar.MINUTE, alarm.minutes);  
  264.         final String time = Alarms.formatTime(this, cal);  
  265.   
  266.         // Inflate the custom view and set each TextView's text.  
  267.         final View v = mFactory.inflate(R.layout.context_menu_header, null);  
  268.         TextView textView = (TextView) v.findViewById(R.id.header_time);  
  269.         textView.setText(time);  
  270.         textView = (TextView) v.findViewById(R.id.header_label);  
  271.         textView.setText(alarm.label);  
  272.   
  273.         // Set the custom view on the menu.  
  274.         menu.setHeaderView(v);  
  275.         // Change the text based on the state of the alarm.  
  276.         if (alarm.enabled) {  
  277.             menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);  
  278.         }  
  279.     }  
  280.       
  281.     /* 
  282.      * (non-Javadoc) 
  283.      * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem) 
  284.      * 设置菜单的点击事件的处理 
  285.      */  
  286.     @Override  
  287.     public boolean onOptionsItemSelected(MenuItem item) {  
  288.         switch (item.getItemId()) {  
  289.             case R.id.menu_item_settings:  
  290.                 startActivity(new Intent(this, SettingsActivity.class));  
  291.                 return true;  
  292.             case R.id.menu_item_desk_clock:  
  293.                 //modify by wangxianming in 2012-4-14  
  294. //                startActivity(new Intent(this, DeskClock.class));  
  295.                 return true;  
  296.             case R.id.menu_item_add_alarm:  
  297.                 addNewAlarm();  
  298.                 return true;  
  299.             default:  
  300.                 break;  
  301.         }  
  302.         return super.onOptionsItemSelected(item);  
  303.     }  
  304.      
  305.     /* 
  306.      * (non-Javadoc) 
  307.      * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu) 
  308.      * 创建菜单 
  309.      */  
  310.     @Override  
  311.     public boolean onCreateOptionsMenu(Menu menu) {  
  312.         getMenuInflater().inflate(R.menu.alarm_list_menu, menu);  
  313.         return super.onCreateOptionsMenu(menu);  
  314.     }  
  315.       
  316.     /* 
  317.      * (non-Javadoc) 
  318.      * @see android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView, android.view.View, int, long) 
  319.      * 创建菜单的点击事件响应 
  320.      */  
  321.     public void onItemClick(AdapterView<?> adapterView, View v, int pos, long id) {  
  322.         Intent intent = new Intent(this, SetAlarm.class);  
  323.         intent.putExtra(Alarms.ALARM_ID, (int) id);  
  324.         startActivity(intent);  
  325.           
  326.     }  
  327.       
  328.    @Override  
  329.     protected void onDestroy() {  
  330.         super.onDestroy();  
  331.         ToastMaster.cancelToast();  
  332.         mCursor.close();  
  333.     }  
  334. }</span>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
目录 第1篇 基础篇 第1章 开发环境 2 1.1 AppServ——PHP集成化安装包 3 实例001 通过AppServ配置PHP开发环境 3 实例002 AppServ应用技巧 6 实例003 第1个PHP程序 7 1.2 XAMPP——PHP集成化安装包 8 实例004 通过XAMPP配置PHP开发环境 8 实例005 测试XAMPP是否安装成功 11 实例006 XAMPP应用技巧 12 实例007 第2个PHP程序 13 1.3 IIS+PHP+MySQL——独立搭建PHP 开发环境 14 实例008 安装PHP 14 实例009 安装MySQL 15 实例010 安装IIS 21 实例011 第3个PHP程序 23 1.4 LAMP——独立配置PHP开发环境 24 实例012 安装Apache服务器 24 实例013 安装MySQL数据库服务器 26 实例014 安装PHP.50 28 实例015 第4个PHP程序 30 1.5 XAMPP——Linux版PHP集成化安装包 31 实例016 XAMPP——Linux下PHP开发环境的集成化 31 实例017 Linux操作系统下启动XAMPP 32 实例018 设置MySQL数据库root用户的密码 33 实例019 第5个PHP程序 34 1.6 Dreamweaver开发工具 35 实例020 Dreamweaver中编码格式的选择 35 实例021 Dreamweaver中创建表格 36 实例022 在表格中插入宠物照片 38 实例023 Dreamweaver创建表单 40 实例024 Dreamweaver中创建和附加CSS样式 42 实例025 Dreamweaver控制弹出信息 45 实例026 Dreamweaver控制浏览器的窗口 46 实例027 通过Dreamweaver创建站点 47 实例028 通过Dreamweaver开发第1个PHP程序 48 1.7 Zend Studio开发工具 50 实例029 安装Zend Studio 50 实例030 Zend Studio创建PHP项目 52 实例031 Zend Studio编码格式的转换 56 实例032 Zend Studio中快捷键的运用 57 实例033 Zend Studio中部署Apache服务器 60 第2章 PHP基础 63 2.1 基本语法 64 实例034 在页面中打印PHP的配置信息 64 实例035 在页面中打印服务器时间 65 实例036 在页面中打印当前执行的PHP文件名 67 实例037 区分单引号和双引号 68 实例038 动态输出JavaScript代码 69 实例039 当数字遇到了字符串 70 实例040 PHP程序员的基础——变量的应用 72 实例041 打印系统环境变量信息print_r($_ENV) 73 实例042 使用可变变量输出“I Like PHP!” 73 实例043 使用转义字符输出特殊字符 74 实例044 使用常量指定PI的值计算圆的面积 75 2.2 运算符 75 实例045 自定义数字的加密/解密算法 76 实例046 比较两个时间戳的大小 77 实例047 使用条件运算符判断数字的奇偶性 78 实例048 判断用户是否具有后台管理权限 79 实例049 打印随机组合生日祝福语 80 实例050 打印2000~2020年的所有闰年 81 实例051 前置运算符和后置运算符的区别 82 实例052 使用位运算对数字进行加密和解密 83 2.3 包含语句 84 实例053 提高代码重用率 84 实例054 包含数据库连接文件 85 实例055 包含网站头文件 86 实例056 包含网站尾文件 87 实例057 包含网站的主文件 88 2.4 条件语句 89 实例058 员工生日提醒 89 实例059 考试成绩评定标准 90 实例060 控制登录用户权限 91 实例061 网页框架的制作 92 实例062 图片验证码 93 实例063 健康生活提醒 95 2.5 循环控制 96 实例064 员工生日列表 96 实例065 员工详细信息浏览 97 实例066 员工信息的批量删除 98 实例067 表格的动态创建 99 实例068 SESSION购物车中数据的读取 100 实例069 员工信息的管理 102 实例070 网页版九九乘法表 104 实例071 读取数组购物车中的数据 105 实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情图的输出 107 实例074 控制页面中数据的输出数量 108 实例075 动态改变页面中单元格的背景颜色 109 实例076 屏蔽偶数次的数据输出 110 实例077 跳过数据输出中指定的记录 111 实例078 执行指定次数的循环 112 2.7 自定义函数 113 实例079 自定义函数截取中文字符串 113 实例080 公告标题的截取 114 实例081 论坛内容的简短输出 116 实例082 自定义函数过滤字符串 117 2.8 字符串 118 实例083 过滤论坛帖子中的空白和特殊字符 118 实例084 对论坛帖子的内容进行转义 119 实例085 还原论坛中帖子的内容 120 实例086 截取论坛标题 121 实例087 分割、合成字符串 121 实例088 查询关键字描红 122 实例089 统计查询关键字的出现次数 123 实例090 获取上传文件的后缀 124 实例091 统一上传文件名称的大小写 125 实例092 论坛中直接输出HTML脚本 126 实例093 统计帖子标题的长度 127 实例094 计算论坛帖子的字节数 128 实例095 实现帖子内容的定位查找 129 实例096 去除帖子标题的首尾空格 129 实例097 货币数据的格式化输出 130 实例098 日期、时间的格式化输出 131 实例099 比对论坛中帖子的相似度 132 实例100 对用户注册的密码进行加密和解密 132 实例101 保护URL地址中传递的参数 133 实例102 解析URL地址中传递的编码参数 134 实例103 转义帖子中的特殊字符 135 实例104 获取任意字符的ASCII码 136 实例105 查找指定ASCII码对应的字符 136 实例106 合理定义上传文件的名称 137 实例107 通过异或方式对用户注册密码进行加密 139 实例108 统一英文注册用户首字母的大小写 139 实例109 字符串与数字之间的转换 140 实例110 通过正则表达式对字符串进行匹配查找 141 实例111 通过IP地址查找主机所在地 142 实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式 147 实例116 验证电话号码的格式是否正确 147 实例117 验证Email地址格式是否正确 148 实例118 验证IP地址是否有效 149 实例119 统计关键字的查询结果 150 实例120 计算查询操作的执行时间 151 实例121 查询关键字描红 152 实例122 判断上传文件的类型 153 实例123 判断邮政编码格式是否正确 154 2.10 数组 154 实例124 创建并输出数组 155 实例125 统计数组元素个数 156 实例126 向数组中添加元素 156 实例127 将数组中指定索引位置的元素替换 157 实例128 获取数组中最后一个元素 158 实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 获取数组当前的键名和值 162 实例135 检测数组中是否存在某个值 163 实例136 获取数组中的当前单元 164 实例137 从数组中随机取出元素 165 实例138 合并数组 166 实例139 拆分数组 167 实例140 遍历数组 168 2.11 日期和时间 169 实例141 设置系统的当前时间 169 实例142 将日期和时间转换为时间戳 170 实例143 获取系统中的特定日期和时间 171 实例144 比较时间的大小 172 实例145 计算考试时间 173 实例146 倒计时 173 实例147 网页闹钟 174 实例148 计算程序运行时间 176 第3章 Web页面交互 178 3.1 获取表单元素的值 179 实例149 设计论坛登录界面 179 实例150 可以上传图片的表单 180 实例151 通过POST方法提交表单元素 182 实例152 通过$_POST方法获取表单元素 182 实例153 通过GET方法提交表单元素 184 实例154 通过$_GET方法获取表单元素 185 3.2 文本框组件的应用 186 实例155 以文本域的形式显示数据信息 186 实例156 限制多行文本域输入的字符个数 187 实例157 设置文本框的只读属性 188 实例158 自动计算金额 189 实例159 为文本框设置默认值 190 实例160 设置文本框的样式 191 实例161 文本域的滚动条 192 3.3 下拉列表的应用 193 实例162 省市级联动菜单 193 实例163 省市县级联动菜单 194 实例164 应用下拉列表选择所要联机的网站 196 实例165 可输入字符的下拉菜单 197 实例166 设置下拉列表的默认值 198 实例167 设置下拉列表的样式 199 实例168 下拉列表打开窗口 200 实例169 Tab键在文本域中的体现 201 3.4 表单元素的动态操作 203 实例170 投票系统中单选按钮与复选框的应用 203 实例171 选中单选按钮后显示其他表单元素 205 实例172 不提交表单获取单选按钮的值 207 实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 214 实例178 去掉下拉选项的边框 215 实例179 修改表单属性为弹出窗口 216 实例180 表单输入单元的文字设置 217 实例181 表单输入单元单击删除 218 实例182 表单文本输入的移动选择 219 实例183 通过下拉列表选择头像 220 3.5 CSS+DIV页面布局 222 实例184 应用CSS+DIV实现无边框窗口 222 实例185 设置表格样式 224 实例186 设置图片的样式 225 实例187 滚动条样式 226 实例188 设置表单样式 227 实例189 设置超链接的样式 229 实例190 设置body的样式 230 实例191 模拟的进度条 231 实例192

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值