一、目标

  通过对话框选择并保存自定义的Toast背景

      

二、代码实现

  1、复制layout文件夹中的model_setting_item.xml文件,以其为模板进行修改(取名为model_choise_item),标题和内容为两个TextView对象、箭头为ImageView对象、直线为View对象,并根据设计进行布局;

model_choise_item布局代码:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="wrap_content"
 4     android:layout_height="wrap_content"
 5     android:layout_marginLeft="10dip"
 6     android:layout_marginRight="10dip" >
 7
 8     <TextView
 9         android:text="标题"
10         android:id="@+id/choise_item_title"
11         android:layout_width="wrap_content"
12         android:layout_height="wrap_content"
13         android:layout_marginTop="10dip"
14         android:textColor="#000000"
15         android:textSize="22dip" />
16
17     <TextView
18         android:text="描述信息"
19         android:id="@+id/choise_item_content"
20         android:layout_width="wrap_content"
21         android:layout_height="wrap_content"
22         android:layout_below="@id/choise_item_title"
23         android:textColor="#88000000"
24         android:textSize="18dip" />
25
26     <ImageView
27         android:src="@drawable/ic_btn_search_go"
28         android:id="@+id/choise_item_imageview"
29         android:layout_width="wrap_content"
30         android:layout_height="wrap_content"
31         android:layout_alignParentRight="true"
32         android:layout_centerVertical="true" />
33
34     <View
35         android:layout_width="match_parent"
36         android:layout_height="0.1dip"
37         android:layout_below="@id/choise_item_content"
38         android:layout_marginTop="2dip"
39         android:background="#70000000" />
40
41 </RelativeLayout>

View Code

  2、在src文件夹中的ui包(com.example.mobilesafe.ui)中,以名为SettingItemView的UI类为模板进行修改(取名ChoiseItemView),并通过View对象的inflate(Context context, int resource, ViewGroup root)方法将1中的布局文件加载至新建的UI类(ChoiseItemView)中。

  (以上步骤可参照第七节自定义组合控件的介绍)

  3、在“设置中心”的布局文件(activity_setting)的最后新增一个第1、2步中自定义的组合控件(com.example.mobilesafe.ui.ChoiseItemView),

  4、在“设置中心”页面中定义组合控件ChoiseItemView的成员变量(取名set_toast_bg)和SharedPreferences对象(取名sp,用于保存已选择的风格);

  5、实例化一个String数组(取名toastStyles),用于Toast风格的命名;

  6、通过findViewById(int id)方法实例化组合控件成员变量(set_toast_bg),并设置其标题文本为要求的文本(归属地信息显示风格);

  7、通过getSharedPreferences(String name, int mode)方法实例化SharedPreferences对象(sp),参数name为配置文件(config),类型为私有(MODE_PRIVATE);

  8、通过SharedPreferences对象(sp)的getInt(String key, int defValue)方法获取配置文件中保存的风格名称(在配置文件中风格参数名称为ToastStyle,保存的值即为风格数组对应角标),key即为风格参数ToastStyle,defValue为当参数找不到时返回的默认值(此时为0)。该方法返回值Int类型的值(取名为toastStyle);

  9、通过定义组合控件ChoiseItemView(set_toast_bg)中定义的设置显示内容的方法setContent(String content),将8中返回风格角标值(即toastStyle)对应的风格数组中的文本显示值控件中;

第5至9步代码:

 1 public class ChoiseItemView extends RelativeLayout {
 2
 3     private TextView choise_item_title,choise_item_content;
 4     private String title,content;
 5
 6     private void iniView(Context context) {
 7         View.inflate(context, R.layout.model_choise_item, ChoiseItemView.this);
 8         choise_item_title = (TextView) this.findViewById(R.id.choise_item_title);
 9         choise_item_content = (TextView) this.findViewById(R.id.choise_item_content);
10     }
11
12     /**
13      * 带有三个参数的构造方法在需要传入样式时调用
14      */
15     public ChoiseItemView(Context context, AttributeSet attrs, int defStyle) {
16         super(context, attrs, defStyle);
17         iniView(context);
18     }
19
20     /**
21      * 带有两个参数的构造方法在布局文件中放置控件的时候调用
22      */
23     public ChoiseItemView(Context context, AttributeSet attrs) {
24         super(context, attrs);
25         iniView(context);
26         title = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.example.mobilesafe", "title");
27         content = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.example.mobilesafe", "content");
28         choise_item_title.setText(title);
29         choise_item_content.setText(content);
30     }
31
32     /**
33      * 带有一个参数的构造方法在new的时候调用
34      */
35     public ChoiseItemView(Context context) {
36         super(context);
37         iniView(context);
38     }
39
40     /**
41      * 设置组合控件显示的标题
42      * @param Title:要显示的标题
43      */
44     public void setTitle(String Title){
45         choise_item_title.setText(Title);
46     }
47
48     /**
49      * 设置组合控件显示的内容
50      * @param content:要显示的内容
51      */
52     public void setContent(String content){
53         choise_item_content.setText(content);
54     }
55 }

View Code

 10、通过自定义控件(set_toast_bg)的setOnClickListener(OnClickListener l)为其设置点击事件监听器,参数OnClickListener 通过new OnClickListener()实例化,并实现未实现的onClick方法

在onClick方法中

    (1)通过SharedPreferences对象(sp)的getInt(String key, int defValue)方法获取已经在配置文件中保存的样式风格(ToastStyle),该方法返回值为int类型(取名toastStyleSaved);

    (2)通过new Builder(Context context)实例化一个AlertDialog.Builder对象(取名toastStylesDialog,用于创建一个选择风格的对话框),参数context为对话框创建时的上下文(此时为SettingActivity.this);

    (3)通过Builder对象(toastStylesDialog)的setTitle(CharSequence title)方法按要求设置对话框的标题;

    (4)通过Builder对象(toastStylesDialog)的setSingleChoiceItems(CharSequence[] items, int checkedItem, OnClickListener listener)方法为对话框确定单项选中时的执行语句,参数items为对话框中要显示的数组(此时即为5中的风格名称数组),参数checkedItem为选中的条目所在的位置序号(此时为0),参数listener为选中单项时的监听器,该监听器通过new实例化,实例化时由于该监听器是接口类型,所以需要在其前面指出其父类(即new DialogInterface.OnClickListener()),并且需要实现其未实现的onClick方法,在onClick方法中:

      ①通过SharedPreferences对象(sp)的edit()方法获取一个Editor对象(取名editer);

      ②通过Editor对象(editer)的putInt(String key, int value)方法将选中的风格序号(也是风格名称数组的角标,即onClick方法里传入的第二个Int类型参数which);

      ③通过Editor对象(editer)的commit()方法提交;

      ④通过自定义控件(set_toast_bg)的setContent(String content)方法将选中的风格名称(即角标对应的风格序号的内容)显示至控件里;

      ⑤通过onClick方法传入的第一个参数对话框接口(dialog)的dismiss()方法使对话框消失;

    (5)通过Builder对象(toastStylesDialog)的setNegativeButton(CharSequence text, OnClickListener listener)方法设置对话框消极按钮,参数text即为显示的文本(此时为取消),参数listener为点击事件监听器(此时不需要为Null);

    (6)通过Builder对象(toastStylesDialog)的show()方法将对话框显示出来。

自定义的归属地Toast背景代码:

 1 //设置自定义的归属地Toast背景,并以SharedPreferences对象保存设置
 2         final String[] toastStyles = {"天空蓝","草木绿","金属灰","土豪金","半透明"};
 3         set_toast_bg = (ChoiseItemView) findViewById(R.id.setting_toast_bg_style);
 4         set_toast_bg.setTitle("归属地信息显示风格");//设置控件标题
 5         sp = getSharedPreferences("config", MODE_PRIVATE);
 6         int toastStyle = sp.getInt("ToastStyle", 0);//获取已保存的风格对应的角标,默认返回为0
 7         set_toast_bg.setContent(toastStyles[toastStyle]);//将已保存的风格名称显示到内容文本中
 8         //设置点击事件,弹出选择对话框
 9         set_toast_bg.setOnClickListener(new OnClickListener() {
10
11             @Override
12             public void onClick(View v) {
13                 int toastStyleSaved = sp.getInt("ToastStyle", 0);//获取配置文件中已保存的样式风格
14                 //弹出对话框
15                 AlertDialog.Builder toastStylesDialog = new Builder(SettingActivity.this);
16                 toastStylesDialog.setTitle("归属地信息显示风格");
17                 toastStylesDialog.setSingleChoiceItems(toastStyles,toastStyleSaved, new DialogInterface.OnClickListener() {
18
19                     @Override
20                     public void onClick(DialogInterface dialog, int which) {
21
22                         //以SharedPreferences对象保存选择的风格
23                         Editor editer = sp.edit();
24                         editer.putInt("ToastStyle", which);
25                         editer.commit();
26                         //设置自定义组合控件(set_toast_bg)的显示内容为选择的风格名称
27                         set_toast_bg.setContent(toastStyles[which]);
28                         //对话框消失
29                         dialog.dismiss();
30                     }
31                 });
32                 toastStylesDialog.setNegativeButton("取消", null);
33                 toastStylesDialog.show();
34             }
35         });

View Code

  11、实现各个自定义Toast背景。在“号码归属地显示”服务(ShowPhoneAddService)中的自定义吐司方法(myToast)

    (1)根据“设置中心”(SettingActivity)页面的自定义Toast背景类型数组的顺序,将各个自定义的Toast背景的资源id加载至新建的Int数组(取名toastBGs)中,其中由于“半透明”样式无对应的图片资源,因此只能通过改变Toast背景的透明度来实现;

    (2)通过View对象的inflate()方法将资源加载进来后,通过SharedPreferences对象获取已经设置保存的自定义Toast样式;

    (3)判断保存的样式是不是特殊的“半透明”样式,如是则通过View对象(view)的setBackgroundColor(int color)方法将其透明度设为一半(值color.transparent),如不是则通过View对象(view)的

setBackgroundResource(int resid)将Int数组(取名toastBGs)中对应的资源Id加载进来。
加载各Toast背景的代码:

1 int[] toastBGs = {R.drawable.toast_bg_blue,R.drawable.toast_bg_green,R.drawable.toast_bg_gray,R.drawable.toast_bg_gold,5};//加载各个自定义Toast背景样式,最后的5是半透明,无样式则通过修改背景透明度实现
2         view = View.inflate(this, R.layout.phone_add_toast, null);
3         SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
4         int toastStyleSaved = sp.getInt("ToastStyle", 0);//通过SharedPreferences对象获取已经设置保存的自定义Toast样式
5         if(toastStyleSaved == 4)//判断保存的Toast样式是不是特殊样式(半透明)
6             view.setBackgroundColor(color.transparent);//如果是半透明,则改变Toast样式背景为半透明
7         else {
8             view.setBackgroundResource(toastBGs[toastStyleSaved]);//如果不是则根据样式的索引加载资源
9         }

View Code

转载于:https://www.cnblogs.com/Red-Shark/p/4469330.html

Android实例-手机安全卫士(四十一)-选择自定义Toast背景相关推荐

  1. Android实例-手机安全卫士(十一)-自定义对话框点击事件处理

    一.目标 在弹出的自定义对话框中,当点击"确认"时,保存密码,关闭对话框:当点击"取消"时关闭对话框.同时,如果不输入密码或输入密码错误则弹出相应的提示. 二. ...

  2. Android实例-手机安全卫士(二十四)-绑定SIM卡

    一.目标. 使用TelephonyManager对象获取手机相关信息,用SharedPreferences对象保存配置信息. 二.代码实现. 1.为"绑定SIM卡"按钮添加id(取 ...

  3. Android实例-手机安全卫士(一)-启动界面

    一.目标. 1.启动时全屏显示,并获得当前应用版本号: 2.美化字体:颜色和文字阴影: 3.添加一个ProgressBar以增加用户体验. 效果如图 二.编写过程. 1.布局.在布局文件中增加一个Te ...

  4. Android实例-手机安全卫士(三十五)-来电号码显示归属地

    一.目标 1.显示来电号码的归属地: 2.可在"设置中心"设置"是否启用来电号码归属地显示" 二.代码实现 (以服务的形式监听来电状态) 1.在项目服务包中新增 ...

  5. Android实例-手机安全卫士(三十六)-根据Service是否开启确定CheckBox选中状态

    一.目标 1.根据service是否在后台运行情况来确定CheckBox的选中状态: 2.解决"设置中心"的"开启来电号码显示归属地"功能在退出程序再进入时选中 ...

  6. 基于Android的手机安全卫士的开发

    基于Android的手机安全卫士的开发 开发环境 处理器:Intel® Core™ i5-5200U CPU 2.20GHz 内存:4GB 硬盘:500GB 操作系统:Windows 7中文版,64位 ...

  7. 基于android平台的手机安全卫士的设计与实现 开题报告,开题报告-基于android的手机安全卫士的设计与开发.doc...

    毕业设计开题报告 题 目: 基于Android的手机安全卫士的设计与开发 专 业 计算机科学与技术 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 电气信息工程学院 专 业 负 责 人 ...

  8. android 视频沉浸式,Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果...

    原文: Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果 需求: 手机app ,当打游戏或者全屏看视频的时候会发现这时候手机顶部的状态栏是不显示的,当我们从手机顶端向下进行滑动或 ...

  9. 基于android的手机安全卫士的实现心得一

    毕设是做一个基于android的手机安全助手,因为也是android新手,边学边做,记录一下做个过程和学习心得,以便写毕业论文也方便以后复习.希望能通过这个项目,基本掌握android开发,不至于虚度 ...

最新文章

  1. 前端测试 karma mocha should 都是什么鬼?
  2. 创业公司如何实施敏捷开发(转载)
  3. java017.Set集合
  4. GVA gin vue从后端接口获取多选下拉框数据
  5. 10.13 nc:多功能网络工具
  6. android默认代码混淆,Android SDK默认混淆配置文件
  7. 2020深度文本匹配最新进展:精度、速度我都要!
  8. mbp网速很慢_苹果笔记本上网很慢怎么回事?macbook无线上网慢的解决方法
  9. 是什么缩写_网友:啊啊啊啊这是什么该死的缩写...“sm居然是这个意思??”...
  10. 关于go语言的测试相关内容笔记
  11. Centos linux 新建文件的方法
  12. DiffMerge 工具记录
  13. Win10 如何解决,应用商店打不开,错误代码0x80131500问题
  14. OSM PBF 文件格式说明
  15. SequoiaDB 巨杉数据库产品下载
  16. 微信小程序_16,组件的生命周期
  17. 对话框窗口过程与普通窗口过程的区别
  18. Bugku CTF每日一题 乌云邀请码
  19. Linux启动过程详解
  20. 数据库架构设计与优化

热门文章

  1. html密码域的type属性,查看网页黑点密码 将type=password中password修改成为text
  2. (详解)钉钉接口,PC端微应用,免登录及获取当前用户信息
  3. opc ua 用哪种语言编写_OPC UA是什么 OPC UA简介
  4. Linux下CGroup进行CPU、内存等资源控制
  5. 3--表格table 个人简历
  6. 项目开发遇到前端传递时间问题处理
  7. 上半年要写的博客文章27
  8. 在 Windows 系统下,如何将“使用VSCode打开”添加至鼠标右键菜单栏
  9. 实验三 多层神经网络
  10. Java面试题上篇(转)