shape资源创建图片 (重点)
1 1 . res - > drawable - > xxx . xml
2
3 < shape xmlns : android = "http://schemas.android.com/apk/res/android"
4 android : shape = "rectangle"
5 >
6 < ! -- shape : 图片的形状 rectangle : 矩形 oval : 椭圆 , 圆形 line : 线 ring : 环形 -- >
7 < ! -- corners : 角的弧度 -- >
8 < corners android : radius = "32dp" / >
9 < ! -- solid 颜色 -- >
10 < solid android : color = "#99FFFFFF" / >
11 < ! -- size : 设置宽高 -- >
12 < size android : width = "32dp"
13 android : height = "32dp"
14 / >
15 < ! -- gradient : 渐变色 angle : 渐变的角度 -- >
16 < gradient android : startColor = "#FF0000" android : centerColor = "#00FF00" android : endColor = "#0000FF" android : angle = "-90" / >
17
18 < / shape >
19 2. 布局文件使用
20 < ! -- layout_margin : 距离父控件上下左右的距离
21 scaleType : 设置图片显示类型 , center : 保持图片大小不变 , 并在ImageView中心显示
22 -- >
23 < ImageView
24 android : id = "@+id/home_btn_setting"
25 android : layout_width = "wrap_content"
26 android : layout_height = "wrap_content"
27 android : src = "@drawable/setting"
28 android : layout_alignParentRight = "true"
29 android : layout_margin = "4dp"
30 android : background = "@drawable/shape_home_setting"
31 android : scaleType = "center"
32 / >
状态选择器 (重点)
1 状态选择器 : 特殊的图片 , 可以根据不同的状态显示不同的图片 , 比如按下 , 抬起
2
3 < selector xmlns : android = "http://schemas.android.com/apk/res/android" >
4 < item android : state_pressed = "true"
5 android : drawable = "@drawable/button_pressed" / > < ! -- pressed : 按下显示的图片 -- >
6 < item android : state_focused = "true"
7 android : drawable = "@drawable/button_focused" / > < ! -- focused : 获取焦点显示的图片 -- >
8 < item android : state_hovered = "true"
9 android : drawable = "@drawable/button_focused" / > < ! -- hovered : 鼠标悬停显示的图片 -- >
10 < item android : drawable = "@drawable/button_normal" / > < ! -- default : 默认显示的状态 -- >
11 < / selector >
12
13 步骤 :
14 1 . res - > drawable - > xxx . xml
15 < selector xmlns : android = "http://schemas.android.com/apk/res/android" >
16 < item android : state_pressed = "true"
17 android : drawable = "@drawable/shape_home_setting_pressed" / > < ! -- pressed : 按下显示的图片 -- >
18 < item android : drawable = "@drawable/shape_home_setting" / > < ! -- default : 默认显示的状态 -- >
19 < / selector >
20 2. 布局文件使用 , 设置控件的背景
21 < ! -- layout_margin : 距离父控件上下左右的距离
22 scaleType : 设置图片显示类型 , center : 保持图片大小不变 , 并在ImageView中心显示
23 clickable : 设置imageView可以点击
24 -- >
25 < ImageView
26 android : id = "@+id/home_btn_setting"
27 android : layout_width = "wrap_content"
28 android : layout_height = "wrap_content"
29 android : src = "@drawable/setting"
30 android : layout_alignParentRight = "true"
31 android : layout_margin = "4dp"
32 android : background = "@drawable/selector_home_setting"
33 android : scaleType = "center"
34 android : clickable = "true"
35 / >
展示gridview的数据
1 1. 设置获取数据
2 private final String [ ] TITLES = new String [ ] { "手机防盗" , "骚扰拦截" , "软件管家" ,
3 "进程管理" , "流量统计" , "手机杀毒" , "缓存清理" , "常用工具" } ;
4 private final String [ ] DESCS = new String [ ] { "远程定位手机" , "全面拦截骚扰" , "管理您的软件" ,
5 "管理运行进程" , "流量一目了然" , "病毒无处藏身" , "系统快如火箭" , "工具大全" } ;
6 private final int [ ] ICONS = new int [ ] { R . drawable . sjfd , R . drawable . srlj ,
7 R . drawable . rjgj , R . drawable . jcgl , R . drawable . lltj , R . drawable . sjsd ,
8 R . drawable . hcql , R . drawable . cygj } ;
9 2. 设置gridview的adapter展示数据
10 12
13 private void initView ( ) {
14
15 ... ...
16
17 // 根据listview操作一样
18 mGridView . setAdapter ( new Myadapter ( ) ) ;
19 }
20
21 private class Myadapter extends BaseAdapter {
22 // 设置条目的个数
23 @ Override
24 public int getCount ( ) {
25 return ICONS . length ;
26 }
27
28 // 设置条目的样式
29 @ Override
30 public View getView ( int position , View convertView , ViewGroup parent ) {
31 //将布局文件转化成view对象
32 View view = View . inflate ( getApplicationContext ( ) , R . layout . home_gridview_item , null ) ;
33 //从view对象中获取控件,展示数据
34 ImageView mIcon = ( ImageView ) view . findViewById ( R . id . item_iv_icon ) ;
35 TextView mTitle = ( TextView ) view . findViewById ( R . id . item_tv_title ) ;
36 TextView mDesc = ( TextView ) view . findViewById ( R . id . item_tv_desc ) ;
37 //展示数据
38 mIcon . setImageResource ( ICONS [ position ] ) ; //根据条目的索引,从数据中获取图片,设置给imageView展示
39 mTitle . setText ( TITLES [ position ] ) ;
40 mDesc . setText ( DESCS [ position ] ) ;
41 return view ;
42 }
43
44 // 根据条目的索引,获取条目对应的数据
45 @ Override
46 public Object getItem ( int position ) {
47 // TODO Auto-generated method stub
48 return null ;
49 }
50
51 // 获取条目的id
52 @ Override
53 public long getItemId ( int position ) {
54 // TODO Auto-generated method stub
55 return 0 ;
56 }
57 }
Gridview的条目样式细节修改
1 1. 修改位置距离
2 < RelativeLayout xmlns : android = "http://schemas.android.com/apk/res/android"
3 android : layout_width = "match_parent"
4 android : layout_height = "wrap_content"
5 android : padding = "6dp"
6 android : background = "@drawable/selector_home_gridview_item_bg"
7 >
8 < ! -- padding : 距离上下左右内边框的距离 -- >
9 < ImageView
10 android : id = "@+id/item_iv_icon"
11 android : layout_width = "wrap_content"
12 android : layout_height = "wrap_content"
13 android : src = "@drawable/sjfd"
14 android : layout_centerVertical = "true"
15 / >
16 < ! -- gravity : 控制控件内部内容 / 控件的位置
17 layout_gravity : 控制控件在父控件的位置
18 layout_centerVertical : RelativeLayout中才可以使用的属性 , 让控件在父控件垂直居中
19 -- >
20 < LinearLayout
21 android : layout_width = "match_parent"
22 android : layout_height = "wrap_content"
23 android : orientation = "vertical"
24 android : layout_toRightOf = "@+id/item_iv_icon"
25 android : layout_marginLeft = "6dp"
26 android : layout_centerVertical = "true"
27 >
28 < TextView
29 android : id = "@+id/item_tv_title"
30 android : layout_width = "wrap_content"
31 android : layout_height = "wrap_content"
32 android : text = "手机防盗"
33 android : textSize = "18sp"
34 android : textColor = "#000000"
35 android : layout_gravity = "center_vertical"
36 / >
37 < TextView
38 android : id = "@+id/item_tv_desc"
39 android : layout_width = "wrap_content"
40 android : layout_height = "wrap_content"
41 android : text = "远程定位手机"
42 android : textSize = "14sp"
43 android : textColor = "#99000000"
44 android : layout_marginTop = "5dp"
45 android : layout_gravity = "center_vertical"
46 / >
47 < / LinearLayout >
48
49 < / RelativeLayout >
50 2. 设置条目的状态选择器
51 res - > drawable - > xxx . xml
52
53 < selector xmlns : android = "http://schemas.android.com/apk/res/android" >
54 < item android : state_pressed = "true" android : drawable = "@drawable/antispam_report_button_press" > < / item >
55 < item android : drawable = "@drawable/antispam_report_button" > < / item >
56 < / selector >
57
58 3. 修改gridview的行与行 , 列与列之间的距离
59
60 < ! -- numColumns : 设置显示的列数
61 horizontalSpacing : 设置列与列之间的距离
62 verticalSpacing : 行与行之间的距离
63 -- >
64 < GridView
65 android : id = "@+id/home_gv_gridview"
66 android : layout_width = "match_parent"
67 android : layout_height = "match_parent"
68 android : numColumns = "2"
69 android : horizontalSpacing = "5dp"
70 android : verticalSpacing = "5dp"
71 > < / GridView >
跳转设置中心界面并搭建设置中心界面
1 1. 跳转操作
2 HomeActivity . java
3
4 8
9 public void enterSetting ( View view ) {
10 //跳转设置中心界面
11 Intent intent = new Intent ( this , SettingActivity . class ) ;
12 startActivity ( intent ) ;
13 }
14 2. 搭建设置中心界面
15 < LinearLayout xmlns : android = "http://schemas.android.com/apk/res/android"
16 xmlns : tools = "http://schemas.android.com/tools"
17 android : layout_width = "match_parent"
18 android : layout_height = "match_parent"
19 android : orientation = "vertical"
20 >
21 < ! -- paddingTop : 距离控件内顶边框的距离 -- >
22 < TextView
23 android : layout_width = "match_parent"
24 android : layout_height = "wrap_content"
25 android : text = "设置中心"
26 android : background = "#429ED6"
27 android : textSize = "20sp"
28 android : textColor = "#FFFFFF"
29 android : gravity = "center"
30 android : paddingTop = "8dp"
31 android : paddingBottom = "8dp"
32 / >
33
34 < / LinearLayout >
样式抽取操作 (重点)
1 因为每个activity的标题的样式都是一样的 , 所有抽取到样式文件中
2 1. 将属性样式抽取到样式文件中
3 res - > values - > styles . xml - > 创建style条目
4
5 < style name = "ActivityTitleStyle" >
6 < item name = "android:layout_width" > match_parent < / item >
7 < item name = "android:layout_height" > wrap_content < / item >
8 < item name = "android:background" > #429ED6 < / item >
9 < item name = "android:textSize" > 20sp < / item >
10 < item name = "android:textColor" > # FFFFFF < / item >
11 < item name = "android:gravity" > center < / item >
12 < item name = "android:paddingTop" > 8dp < / item >
13 < item name = "android:paddingBottom" > 8dp < / item >
14 < / style >
15 2. 布局文件使用样式
16 < ! -- paddingTop : 距离控件内顶边框的距离
17 style : 设置使用样式
18 -- >
19 < TextView
20 style = "@style/ActivityTitleStyle"
21 android : text = "设置中心"
22 / >
将设置中心条目的布局抽取到自定义组合控件操作 (重点)
1 1. 创建设置中心条目的布局
2 < RelativeLayout xmlns : android = "http://schemas.android.com/apk/res/android"
3 android : layout_width = "match_parent"
4 android : layout_height = "wrap_content"
5 android : paddingTop = "8dp"
6 android : paddingBottom = "8dp"
7 android : paddingLeft = "30dp"
8 android : paddingRight = "30dp"
9 >
10
11 < TextView
12 android : id = "@+id/settingview_tv_text"
13 android : layout_width = "wrap_content"
14 android : layout_height = "wrap_content"
15 android : text = "设置自动更新"
16 android : textColor = "#000000"
17 android : textSize = "18sp"
18 android : layout_centerVertical = "true"
19 / >
20
21 < ImageView
22 android : id = "@+id/settingview_iv_islock"
23 android : layout_width = "wrap_content"
24 android : layout_height = "wrap_content"
25 android : src = "@drawable/off"
26 android : layout_alignParentRight = "true"
27 android : layout_centerVertical = "true"
28 / >
29 < / RelativeLayout >
30 2. 创建自定义控件
31 public class SettingView extends RelativeLayout {
32
33 public SettingView ( Context context ) {
34 //super(context);
35 this ( context , null ) ;
36 }
37
38 public SettingView ( Context context , AttributeSet attrs ) {
39 //super(context, attrs);
40 this ( context , attrs , - 1 ) ;
41 }
42
43 public SettingView ( Context context , AttributeSet attrs , int defStyle ) {
44 super ( context , attrs , defStyle ) ;
45
46 initView ( ) ;
47 }
48 }
49 3. 将设置中心条目的布局文件转化为view对象 , 添加自定义控件中
50 53
54 private void initView ( ) {
55 //将设置中心条目的布局,转化成view对象,添加到自定义控件中
56 View view = View . inflate ( getContext ( ) , R . layout . settingview , null ) ;
57 this . addView ( view ) ; //将一个view对象,添加到自定义控件中
58 }
59 4. 使用操作
60 < cn . itcast . mobliesafe05 . view . SettingView
61 android : id = "@+id/setting_sv_update"
62 android : layout_width = "match_parent"
63 android : layout_height = "wrap_content"
64 > < / cn . itcast . mobliesafe05 . view . SettingView >
设置条目的背景
1 因为每个条目的背景都不一样 , 所有没有抽取背景 , 直接单独设置
2 1. 创建背景的状态选择器
3
4 res - > drawable - > xxx . xml
5
6 < selector xmlns : android = "http://schemas.android.com/apk/res/android" >
7 < item android : state_pressed = "true"
8 android : drawable = "@drawable/first_pressed" / > < ! -- pressed : 按下显示的图片 -- >
9 < item android : drawable = "@drawable/first_normal" / > < ! -- default : 默认显示的状态 -- >
10 < / selector >
11
12 2. 设置设置中心中的界面的自定义控件
13
14 < cn . itcast . mobliesafe05 . view . SettingView
15 android : id = "@+id/setting_sv_update"
16 android : layout_width = "match_parent"
17 android : layout_height = "wrap_content"
18 android : background = "@drawable/selector_setting_item_top"
19 android : layout_marginTop = "8dp"
20 android : clickable = "true"
21 > < / cn . itcast . mobliesafe05 . view . SettingView >
创建自定义属性操作 (重点)
1 自定义属性 : 因为系统没有提供相关属性给我们使用 , 所以我们要自己创建 , 自己使用
2
3 参考系统的操作
4 sdk\platforms\android - 16 \data\res\values\attrs . xml - > 搜索TextView
5
6 步骤
7 res - > values - > attrs . xml
8
9 < resources >
10 < declare - styleable name = "SettingView" >
11 < ! -- 设置文本的属性 -- >
12 < attr name = "title" format = "string" / > < ! -- name : 属性的名称 format : 属性的值的类型 -- >
13 < / declare - styleable >
14 < / resources >
15
16 检测 : 查看 R 文件是否有创建属性的标示
使用自定属性的操作 (重点)
1 1. 布局文件中使用自定义属性
2
3 activity_setting . xml
4
5 1.1 . 设置命名空间
6 xmlns : itcast = "http://schemas.android.com/apk/res/cn.itcast.mobliesafe05"
7 1.2 . 控件中如何使用
8 < cn . itcast . mobliesafe05 . view . SettingView
9 android : id = "@+id/setting_sv_update"
10 android : layout_width = "match_parent"
11 android : layout_height = "wrap_content"
12 android : background = "@drawable/selector_setting_item_top"
13 android : layout_marginTop = "8dp"
14 android : clickable = "true"
15 itcast : title = "设置自动更新"
16 > < / cn . itcast . mobliesafe05 . view . SettingView >
17 2. 因为自定义控件是否无法显示文本 , 显示文本是通过自定义控件中的textview显示的 , 所以需要将设置的文本传递给自定义控件的textview进行显示
18
19 cn . itcast . mobliesafe05 . view . SettingView . java
20
21 2.1 . 在自定义控件获取设置给自定义控件的文本数据
22 public SettingView ( Context context , AttributeSet attrs , int defStyle ) {
23 super ( context , attrs , defStyle ) ;
24
25 initView ( ) ;
26
27 //因为自定义控件无法显示自定义属性设置的文本,所以需要将自定义属性的文本获取出来设置给textview显示
28 //1.获取自定义属性的值,因为AttributeSet保存到控件的所有属性的值
29 //通过命名空间和属性的名称,获取属性的值
30 //namespace : 命名空间
31 //name : 属性的名称
32 String title = attrs . getAttributeValue ( NAMESPACE , "title" ) ;
33
34 }
35 2.2 . 将自定义控件中的textview初始化出来
36 39
40 private void initView ( ) {
41
42 ... . .
43
44 //初始化控件
45 mText = ( TextView ) view . findViewById ( R . id . settingview_tv_text ) ;
46 mIcon = ( ImageView ) view . findViewById ( R . id . settingview_iv_islock ) ;
47 }
48 2.3 . 将获取的属性的值设置给textview展示
49 public SettingView ( Context context , AttributeSet attrs , int defStyle ) {
50 super ( context , attrs , defStyle ) ;
51
52 ... ... ...
53
54 //2.将获取的属性的值设置给textview展示了
55 mText . setText ( title ) ;
56 }
创建一个隐藏显示图片的属性
1 1. 创建自定义的属性
2 res - > values - > attrs . xml
3
4 < resources >
5 < declare - styleable name = "SettingView" >
6 < ! -- 设置文本的属性 -- >
7 < attr name = "title" format = "string" / > < ! -- name : 属性的名称 format : 属性的值的类型 -- >
8 < ! -- 隐藏显示图片的属性 -- >
9 < attr name = "istoggle" format = "boolean" / >
10 < / declare - styleable >
11 < / resources >
12 2. 布局文件中使用
13 2.1 . 命名空间
14 xmlns : itcast = "http://schemas.android.com/apk/res/cn.itcast.mobliesafe05"
15 2.2 . 控件中使用
16 < cn . itcast . mobliesafe05 . view . SettingView
17 ... ...
18 itcast : istoggle = "true"
19 > < / cn . itcast . mobliesafe05 . view . SettingView >
20 3. 在自定义控件中获取属性的值 , 根据属性的值设置图片隐藏显示
21
22 SettingView . java
23
24 public SettingView ( Context context , AttributeSet attrs , int defStyle ) {
25 super ( context , attrs , defStyle ) ;
26
27 ... ... .
28
29 //获取隐藏显示图片属性的值,根据属性的值设置图片的隐藏显示
30 //参数3:默认的值,表示没有获取到属性的值的时候,使用什么样的值
31 boolean b = attrs . getAttributeBooleanValue ( NAMESPACE , "istoggle" , true ) ;
32 //根据获取的值,设置图片显示隐藏
33 mIcon . setVisibility ( b ? View . VISIBLE : View . GONE ) ; //设置控件的隐藏显示
34 }
开启关闭开关
1 1. 在SettingActivity中设置条目的点击事件
2 @ Override
3 public void onClick ( View v ) {
4 switch ( v . getId ( ) ) {
5 case R . id . setting_sv_update :
6
7 //按钮是开启 -> 关闭 关闭 -> 开启
8
9 break ;
10
11 default :
12 break ;
13 }
14 }
15 2. 因为在Activity中点击条目 , 更改的时候自定义控件中的图片的值 , 所以需要在自定义控件中创建方法 , 方便activity调用
16 19
20 public void setToggleOn ( boolean isToggle ) {
21 //保存开关的状态
22 mIsToggle = isToggle ;
23 if ( isToggle ) {
24 mIcon . setImageResource ( R . drawable . on ) ;
25 } else {
26 mIcon . setImageResource ( R . drawable . off ) ;
27 }
28 }
29
30 33
34 public boolean isToggle ( ) {
35 return mIsToggle ;
36 }
37 3. 在Activity的点击事件中调用自定义控件中创建的方法使用
38 @ Override
39 public void onClick ( View v ) {
40 switch ( v . getId ( ) ) {
41 case R . id . setting_sv_update :
42
43 //开启 -> 关闭 关闭 -> 开启
44 //问题:需要知道开关是开启还是关闭
45 if ( mUpdate . isToggle ( ) ) {
46 mUpdate . setToggleOn ( false ) ;
47 } else {
48 mUpdate . setToggleOn ( true ) ;
49 }
50
51 break ;
52
53 default :
54 break ;
55 }
56 }
开启关闭优化操作
1 1. 在SettingView自定义控件中创建优化的方法
2 5
6 public void toggle ( ) {
7 //第一步优化
8 /*if (isToggle()) {
9 setToggleOn(false);
10 }else{
11 setToggleOn(true);
12 }*/
13 //第二步优化
14 /*if (mIsToggle) {
15 setToggleOn(!mIsToggle);
16 }else{
17 setToggleOn(!mIsToggle);
18 }*/
19 //第三步优化
20 setToggleOn ( ! mIsToggle ) ;
21 }
22 2. 在Activity中点击事件中实现调用优化方法
23 @ Override
24 public void onClick ( View v ) {
25 switch ( v . getId ( ) ) {
26 case R . id . setting_sv_update :
27
28 //按钮是开启 -> 关闭 关闭 -> 开启
29 mUpdate . toggle ( ) ;
30
31 break ;
32
33 default :
34 break ;
35 }
36 }
回显开关状态
1 点击条目开启 / 关闭按钮的时候 , 保存按钮的开关状态 , 当再次进入的时候 , 获取保存的状态 , 根据保存的状态设置按钮的开启和关闭
2
3 具体步骤 :
4 1. 创建SharedPreferences工具类 , 设置保存和获取数据的操作
5 public class SharedPreferencesUtils {
6
7 private static SharedPreferences sp ;
8
9 12
13 public static void saveBoolean ( Context context , String key , boolean value ) {
14 //name : 保存信息的文件的名称
15 if ( sp == null ) {
16 sp = context . getSharedPreferences ( "config" , Context . MODE_PRIVATE ) ;
17 }
18 //保存数据
19 //key : 保存信息的名称
20 //value : 保存的信息
21 sp . edit ( ) . putBoolean ( key , value ) . commit ( ) ;
22 }
23 26
27 public static boolean getBoolean ( Context context , String key , boolean defValue ) {
28 if ( sp == null ) {
29 sp = context . getSharedPreferences ( "config" , Context . MODE_PRIVATE ) ;
30 }
31 //key : 保存信息的名称
32 //defValue : 默认的值
33 return sp . getBoolean ( key , defValue ) ;
34 }
35 }
36 2. 在activity的点击事件中保存开关状态
37 @ Override
38 public void onClick ( View v ) {
39 switch ( v . getId ( ) ) {
40 case R . id . setting_sv_update :
41
42 //按钮是开启 -> 关闭 关闭 -> 开启
43 mUpdate . toggle ( ) ;
44 //保存开关状态,方便回显操作
45 SharedPreferencesUtils . saveBoolean ( this , "isUpdate" , mUpdate . isToggle ( ) ) ;
46
47 break ;
48
49 default :
50 break ;
51 }
52 }
53 3. 在再次进入activity进行回显操作
54
55 private void initView ( ) {
56 mUpdate = ( SettingView ) findViewById ( R . id . setting_sv_update ) ;
57
58 //设置自动更新的点击事件
59 mUpdate . setOnClickListener ( this ) ;
60
61 //再次进入界面回显设置自动更新的开关操作
62 setUpdate ( ) ;
63 }
64
65 68
69 private void setUpdate ( ) {
70 boolean b = SharedPreferencesUtils . getBoolean ( this , "isUpdate" , true ) ;
71 //根据保存的状态,设置开关状态
72 mUpdate . setToggleOn ( b ) ;
73 }
SharedPreferences的key的优化操作
1 1. 创建公共接口
2 public interface Constants {
3
4
5 public static final String ISUPDATE = "isUpdate" ;
6
7 }
8 2. 在代码中使用
9 boolean b = SharedPreferencesUtils . getBoolean ( this , Constants . ISUPDATE , true ) ;
根据保存的开关状态控制是否显示更新对话框
1 cn . itcast . mobliesafe05 . SplashActivity . java
2
3 private void initView ( ) {
4 mVersion = ( TextView ) findViewById ( R . id . splash_tv_version ) ;
5
6 ... .
7
8 new Handler ( ) . postDelayed ( new Runnable ( ) {
9
10 @ Override
11 public void run ( ) {
12
13 //获取保存的设置中心设置自动更新按钮的开关状态,如果是true:更新操作,如果是false:不再更新,跳转首页
14 boolean b = SharedPreferencesUtils . getBoolean ( getApplicationContext ( ) , Constants . ISUPDATE , true ) ;
15 if ( b ) {
16 update ( ) ;
17 } else {
18 //跳转到首页
19 enterHome ( ) ;
20 }
21
22 }
23 } , 2000 ) ; //延迟多久给handler发送消息
24
25
26
27 }
设置显示设置密码对话框 (重点)
1 HomeActivity . java
2
3 1. 设置gridview条目的点击事件
4 private void initView ( ) {
5 ... .
6
7 //设置gridview的条目点击事件
8 mGridView . setOnItemClickListener ( this ) ;
9 }
10
11
12 //view : 被点击条目的view对象
13 //position : 被点击的条目的索引
14 //id : 被点击的条目的id
15 @ Override
16 public void onItemClick ( AdapterView < ? > parent , View view , int position ,
17 long id ) {
18 switch ( position ) {
19 case 0 :
20 //手机防盗
21 //弹出设置密码/输入密码对话框
22 showSetPassWordDialog ( ) ;
23 break ;
24 }
25 }
26 2. 创建设置密码对话框的布局
27 < LinearLayout xmlns : android = "http://schemas.android.com/apk/res/android"
28 android : layout_width = "match_parent"
29 android : layout_height = "match_parent"
30 android : orientation = "vertical" >
31 < ! -- drawableLeft : 在文本的左边设置图片
32 drawablePadding : 设置图片和文本的距离
33 -- >
34 < TextView
35 android : layout_width = "match_parent"
36 android : layout_height = "wrap_content"
37 android : text = "初始化密码设置"
38 android : textColor = "#000000"
39 android : textSize = "18sp"
40 android : drawableLeft = "@drawable/dialog_title_default_icon"
41 android : padding = "8dp"
42 android : drawablePadding = "8dp"
43 android : gravity = "center_vertical"
44 android : background = "@drawable/dialog_title_background"
45 / >
46 < ! -- inputType : 设置输入的类型 -- >
47 < EditText
48 android : id = "@+id/dialog_et_psw"
49 android : layout_width = "match_parent"
50 android : layout_height = "wrap_content"
51 android : hint = "请输入密码"
52 android : inputType = "textPassword"
53 android : layout_margin = "8dp"
54 / >
55
56 < EditText
57 android : id = "@+id/dialog_et_confirm"
58 android : layout_width = "match_parent"
59 android : layout_height = "wrap_content"
60 android : hint = "请再次输入密码"
61 android : inputType = "textPassword"
62 android : layout_marginLeft = "8dp"
63 android : layout_marginRight = "8dp"
64 / >
65
66 < LinearLayout
67 android : layout_width = "match_parent"
68 android : layout_height = "wrap_content"
69 android : orientation = "horizontal"
70 android : padding = "8dp"
71 >
72 < Button
73 android : id = "@+id/dialog_btn_ok"
74 android : layout_width = "0dp"
75 android : layout_weight = "1"
76 android : layout_height = "wrap_content"
77 android : text = "确定"
78 android : layout_marginRight = "4dp"
79 android : background = "@drawable/selector_home_dialog_ok"
80 android : textColor = "#FFFFFF"
81 / >
82
83 < Button
84 android : id = "@+id/dialog_btn_cancel"
85 android : layout_width = "0dp"
86 android : layout_weight = "1"
87 android : layout_height = "wrap_content"
88 android : text = "取消"
89 android : layout_marginLeft = "4dp"
90 android : background = "@drawable/selector_home_dialog_cancel"
91 / >
92
93 < / LinearLayout >
94 < / LinearLayout >
95 3. 设置显示对话框
96 private void showSetPassWordDialog ( ) {
97 AlertDialog . Builder builder = new Builder ( this ) ;
98 //将布局文件转化为view对象
99 View view = View . inflate ( this , R . layout . home_setpassword_dialog , null ) ;
100 //将一个布局文件的view对象设置给dialog,通过dialog显示
101 builder . setView ( view ) ;
102 builder . show ( ) ;
103 }
设置密码对话框的操作
1 private void showSetPassWordDialog ( ) {
2 AlertDialog . Builder builder = new Builder ( this ) ;
3 //将布局文件转化为view对象
4 View view = View . inflate ( this , R . layout . home_setpassword_dialog , null ) ;
5
6 //初始化控件,设置操作
7 final EditText mPsw = ( EditText ) view . findViewById ( R . id . dialog_et_psw ) ;
8 final EditText mConfirm = ( EditText ) view . findViewById ( R . id . dialog_et_confirm ) ;
9 Button mOk = ( Button ) view . findViewById ( R . id . dialog_btn_ok ) ;
10 Button mCancel = ( Button ) view . findViewById ( R . id . dialog_btn_cancel ) ;
11
12 //设置确定和取消按钮的点击事件
13 mOk . setOnClickListener ( new OnClickListener ( ) {
14
15 @ Override
16 public void onClick ( View v ) {
17 //1.获取输入的密码
18 String psw = mPsw . getText ( ) . toString ( ) . trim ( ) ;
19 //判断密码是否为空
20 if ( TextUtils . isEmpty ( psw ) ) { // null ""
21 Toast . makeText ( getApplicationContext ( ) , "密码不能为空" , 0 ) . show ( ) ;
22 //不能执行其他操作
23 return ;
24 }
25 //2.获取再次输入密码
26 String confirm = mConfirm . getText ( ) . toString ( ) . trim ( ) ;
27 //判断两次输入密码是否一致
28 if ( psw . equals ( confirm ) ) {
29 Toast . makeText ( getApplicationContext ( ) , "密码设置成功" , 0 ) . show ( ) ;
30 //隐藏对话框
31 dialog . dismiss ( ) ;
32 } else {
33 Toast . makeText ( getApplicationContext ( ) , "两次密码不一致" , 0 ) . show ( ) ;
34 }
35 }
36 } ) ;
37 mCancel . setOnClickListener ( new OnClickListener ( ) {
38
39 @ Override
40 public void onClick ( View v ) {
41 //隐藏对话框
42 dialog . dismiss ( ) ;
43 }
44 } ) ;
45
46 //将一个布局文件的view对象设置给dialog,通过dialog显示
47 builder . setView ( view ) ;
48 //builder.show();
49 dialog = builder . create ( ) ;
50 dialog . show ( ) ;
51 }
判断弹出设置密码对话框还是输入密码对话框
1 1. 修改SharedPreferencesUtils工具类 , 增加保存 String 类型数据的操作
2 5
6 public static void saveString ( Context context , String key , String value ) {
7 //name : 保存信息的文件的名称
8 if ( sp == null ) {
9 sp = context . getSharedPreferences ( "config" , Context . MODE_PRIVATE ) ;
10 }
11 //保存数据
12 //key : 保存信息的名称
13 //value : 保存的信息
14 sp . edit ( ) . putString ( key , value ) . commit ( ) ;
15 }
16 19
20 public static String getString ( Context context , String key , String defValue ) {
21 if ( sp == null ) {
22 sp = context . getSharedPreferences ( "config" , Context . MODE_PRIVATE ) ;
23 }
24 //key : 保存信息的名称
25 //defValue : 默认的值
26 return sp . getString ( key , defValue ) ;
27 }
28 2. 在HomeActivity的设置密码对话框中 , 密码设置成功 , 保存设置的密码
29 private void showSetPassWordDialog ( ) {
30
31 ... . .
32
33 //设置确定和取消按钮的点击事件
34 mOk . setOnClickListener ( new OnClickListener ( ) {
35
36 @ Override
37 public void onClick ( View v ) {
38
39 ... ...
40
41 //判断两次输入密码是否一致
42 if ( psw . equals ( confirm ) ) {
43
44 ... ... .
45
46 //保存的设置的密码
47 SharedPreferencesUtils . saveString ( getApplicationContext ( ) , Constants . SJFDPSW , psw ) ;
48 } else {
49 Toast . makeText ( getApplicationContext ( ) , "两次密码不一致" , 0 ) . show ( ) ;
50 }
51 }
52 } ) ;
53
54 ... . .
55 }
56 3. 在Gridview条目点击事件中 , 增加判断操作
57 @ Override
58 public void onItemClick ( AdapterView < ? > parent , View view , int position ,
59 long id ) {
60 switch ( position ) {
61 case 0 :
62 //手机防盗
63 //弹出设置密码/输入密码对话框
64 //判断是弹出设置密码对话框还是弹出输入密码对话框
65 //可以在设置密码成功的是将密码保存,获取保存的密码来判断是弹出设置密码还是输入密码对话框
66 String sp_psw = SharedPreferencesUtils . getString ( getApplicationContext ( ) , Constants . SJFDPSW , "" ) ;
67 if ( TextUtils . isEmpty ( sp_psw ) ) {
68 //弹出设置密码对话框
69 showSetPassWordDialog ( ) ;
70 } else {
71 //弹出输入密码对话框
72 Toast . makeText ( getApplicationContext ( ) , "弹出输入密码对话框" , 0 ) . show ( ) ;
73 }
74
75 break ;
76 }
77 }
输入密码对话框操作
1 参考设置密码对话框
2
3 6
7 private void showEnterPassWordDialog ( ) {
8 AlertDialog . Builder builder = new Builder ( this ) ;
9 //将布局文件转化为view对象
10 View view = View . inflate ( this , R . layout . home_enterpassword_dialog , null ) ;
11
12 //初始化控件,设置操作
13 final EditText mPsw = ( EditText ) view . findViewById ( R . id . dialog_et_psw ) ;
14 Button mOk = ( Button ) view . findViewById ( R . id . dialog_btn_ok ) ;
15 Button mCancel = ( Button ) view . findViewById ( R . id . dialog_btn_cancel ) ;
16
17 mOk . setOnClickListener ( new OnClickListener ( ) {
18
19 @ Override
20 public void onClick ( View v ) {
21 //1.获取输入的密码
22 String psw = mPsw . getText ( ) . toString ( ) . trim ( ) ;
23 if ( TextUtils . isEmpty ( psw ) ) {
24 Toast . makeText ( getApplicationContext ( ) , "密码不能为空" , 0 ) . show ( ) ;
25 return ;
26 }
27 //2.判断密码输入是否正确了
28 //判断输入的跟保存的是否一致
29 String sp_psw = SharedPreferencesUtils . getString ( getApplicationContext ( ) , Constants . SJFDPSW , "" ) ;
30 //判断密码是否正确了
31 if ( psw . equals ( sp_psw ) ) {
32 Toast . makeText ( getApplicationContext ( ) , "密码正确" , 0 ) . show ( ) ;
33 dialog . dismiss ( ) ;
34 } else {
35 Toast . makeText ( getApplicationContext ( ) , "密码错误" , 0 ) . show ( ) ;
36 }
37 }
38 } ) ;
39
40 mCancel . setOnClickListener ( new OnClickListener ( ) {
41
42 @ Override
43 public void onClick ( View v ) {
44 dialog . dismiss ( ) ;
45 }
46 } ) ;
47
48 //将一个布局文件的view对象设置给dialog,通过dialog显示
49 builder . setView ( view ) ;
50 //builder.show();
51 dialog = builder . create ( ) ;
52 dialog . show ( ) ;
53 }