Android 手机卫士--自定义属性

在前面的文章中,已经实现了“设置中心”第一栏的功能以及布局

本文地址:http://www.cnblogs.com/wuyudong/p/5936016.html,转载请注明出处。

自定义属性声明

接下来实现其他栏的布局和功能,由于它们之间的功能和布局类似,只是属性名称不同。所以本文在自定义控件的基础上实现自定义属性

首先参考标准控件的源码,这里选择TextView

源码路径为:D:\adt-bundle-windows-x86_64_20140101\sdk\platforms\android-18\data\res\values

打开本文件夹下的attrs.xml文件,找到下面的代码:

    <declare-styleable name="TextView">
        <!-- Determines the minimum type that getText() will return.
             The default is "normal".
             Note that EditText and LogTextBox always return Editable,
             even if you specify something less powerful here. -->
        <attr name="bufferType">
            <!-- Can return any CharSequence, possibly a
             Spanned one if the source text was Spanned. -->
            <enum name="normal" value="0" />
            <!-- Can only return Spannable. -->
            <enum name="spannable" value="1" />
            <!-- Can only return Spannable and Editable. -->
            <enum name="editable" value="2" />
        </attr>
        <!-- Text to display. -->
        <attr name="text" format="string" localization="suggested" />
        <!-- Hint text to display when the text is empty. -->
        <attr name="hint" format="string" />

于是我们也可以模仿关键节点,写出自定义属性,工程res\values文件夹下新建attrs.xml文件,添加代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="com.wuyudong.mobilesafe.view.SettingItemView">
        <attr name="destitle" format="string"/>
        <attr name="desoff" format="string"/>
        <attr name="deson" format="string"/>
    </declare-styleable>
</resources>

构造方法中获取自定义属性值

接下来定义命名空间,也是参考android标准来写

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
……

mobilesafe替换掉原有android

com.wuyudong.mobilesafe必须这样编写,替换掉了android,代表当前应用自定义属性
xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"

修改后的代码如下:

    <com.wuyudong.mobilesafe.view.SettingItemView
        xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"
        android:id="@+id/siv_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        mobilesafe:destitle="自动更新设置"
        mobilesafe:desoff="自动更新已关闭"
        mobilesafe:deson="自动更新已开启" >
    </com.wuyudong.mobilesafe.view.SettingItemView>

自定义属性值已经搞定,现在是SettingItemView类如何获取这些值?

在SettingItemView类的构造函数中调用initAttrs函数,然后通过initAttrs函数实现属性的返回。先通过一些小的实践来熟悉相关的API

   /**
     * 返回属性集合中自定义属性的属性值
     * @param attrs  构造方法中维护好的属性集合
     */
    private void initAttrs(AttributeSet attrs) {
        //获取属性的总个数
        Log.i(tag,"attrs.getAttributeCount(): " + attrs.getAttributeCount());
        //获取属性名称以及属性值
        for (int i = 0; i < attrs.getAttributeCount(); i++) {
            Log.i(tag, "name = " + attrs.getAttributeName(i));
            Log.i(tag, "value = " + attrs.getAttributeValue(i));
            Log.i(tag, "==================分割线======================");
        }
    }

运行项目后在Logcat中打印下面的日志信息:

解释一下上面的部分代码:

value = @2131427413对应的十六进制值为:7F0B0055,其实就是对应的R文件中

public static final int siv_update=0x7f0b0055;

其他的都很简单

接着我们使用其他的API来进行获取属性的值

private static final String NAMESPACE = "http://schemas.android.com/apk/res/com.wuyudong.mobilesafe";
...........

 /**
     * 返回属性集合中自定义属性的属性值
     * @param attrs  构造方法中维护好的属性集合
     */
    private void initAttrs(AttributeSet attrs) {
     /*   //获取属性的总个数
        Log.i(tag,"attrs.getAttributeCount(): "+attrs.getAttributeCount());
        //获取属性名称以及属性值
        for (int i = 0; i < attrs.getAttributeCount(); i++) {
            Log.i(tag, "name = " + attrs.getAttributeName(i));
            Log.i(tag, "value = " + attrs.getAttributeValue(i));
            Log.i(tag, "==================分割线======================");
        }*/
        String destitle = attrs.getAttributeValue(NAMESPACE, "destitle");
        String desoff = attrs.getAttributeValue(NAMESPACE, "desoff");
        String deson = attrs.getAttributeValue(NAMESPACE, "deson");
        Log.i(tag, destitle);
        Log.i(tag, desoff);
        Log.i(tag, deson);
    }

运行项目后在Logcat中打印下面的日志信息:

说明已经成功获取所设置的属性值

这样就可以复用代码实现第二栏的电话归属地的布局

    <com.wuyudong.mobilesafe.view.SettingItemView
        xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"
        android:id="@+id/siv_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        mobilesafe:destitle="自动更新设置"
        mobilesafe:desoff="自动更新已关闭"
        mobilesafe:deson="自动更新已开启" >
    </com.wuyudong.mobilesafe.view.SettingItemView>

    <com.wuyudong.mobilesafe.view.SettingItemView
        xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        mobilesafe:destitle="电话归属地的显示设置"
        mobilesafe:desoff="归属地的显示已关闭"
        mobilesafe:deson="归属地的显示已开启" >
    </com.wuyudong.mobilesafe.view.SettingItemView>
时间: 2024-10-06 22:55:25

Android 手机卫士--自定义属性的相关文章

Android 手机卫士--弹出对话框

在<Android 手机卫士--解析json与消息机制发送不同类型消息>一文中,消息机制发送不同类型的信息还没有完全实现,在出现异常的时候,应该弹出吐司提示异常,代码如下: private Handler mHandler = new Handler() { // public void handleMessage(android.os.Message msg) { switch (msg.what) { case UPDATE_VERSION: //弹出对话框,提示用户更新 //showUp

Android 手机卫士--确认密码对话框编写

本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. 布局文件和<Android 手机卫士--设置密码对话框>中的布局基本类似,所有copy一下,修改一点细节就搞定: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and

Android 手机卫士--签名文件说明&amp;包名说明

在<Android 手机卫士--打包生成apk维护到服务器>一文中,实现了新版本的apk到服务器,当打开客户端apk的时候,发现有新版本,提示更新.还实现了利用xutils工具实现了从服务器端下载apk 本文地址:http://www.cnblogs.com/wuyudong/p/5903484.html,转载请注明源地址. 本文实现下载本机apk的安装,过程很简单,参考<Android APK的安装> 代码如下: /** * 安装对应的apk * @param file 安装文件

Android 手机卫士--安装过程中点击回退按钮

本文地址:http://www.cnblogs.com/wuyudong/p/5903707.html,转载请注明源地址. 在手机卫士之前的版本升级的对话框中: 有的用户暂时不想更新,没有点击“稍后再说”,而是选择点击回退按键,那么这时候的逻辑应该是让用户进入home界面而不是splash界面.所以需要添加代码逻辑来控制,添加的代码如下: builder.setOnCancelListener(new OnCancelListener() { @Override public void onCa

Android 手机卫士--阶段小结1

本文地址:http://www.cnblogs.com/wuyudong/p/5904528.html,转载请注明源地址. 本文对之前手机卫士开发进行一个小结. 1.SplashActivity 版本名称的展示,从清单配置文件中获取版本名称,PackageManager 服务端新版本的检测(本地版本号<服务器版本号) 展示logo 2.手机防盗 sim卡绑定:每一款手机都会有相应的卡的序列号,一旦替换掉原有电话卡,序列号会发生改变 3.手机卫士分包 基础课程分包方式,每一个类包名, com.it

[android] 手机卫士自定义滚动控件

TextView控件设置单行显示 android:singleLine=”true” 设置TextView开始的位置显示省略号,android:ellipsize=”start” 设置滚动属性,android:ellipsize=”marquee” 当控件有焦点的时候,才会调用那个滚动效果 新建一个ui包 新建一个类FocusedTextView继承系统的TextView 重写构造方法 重写isFoused()方法,返回true,就可以让它生来就有焦点,其实并没有焦点,只是欺骗了android系

Android 手机卫士12--进程管理

1.本进程不能被选中,所以先将checkbox隐藏掉--手机卫士 不能自杀 if(getItem(position).packageName.equals(getPackageName())){ holder.cb_box.setVisibility(View.GONE); }else{ holder.cb_box.setVisibility(View.VISIBLE); } 2.清理选中进程 private void clearAll() { //1,获取选中进程 //2,创建一个记录需要杀死

Android 手机卫士17--缓存清理

清理单个应用缓存 通过反射调用方法 需要权限:android.permission.DELETE_CACHE_FILES. 以上权限为系统权限,手机卫士应用为用户应用,不能拿到此权限 换思路: 调用系统清除缓存的界面,让用户在系统清除缓存界面实现清除逻辑 查找系统清除缓存的界面方法:

[android] 手机卫士欢迎细节和主界面

splash界面的细节 ctrl + O 搜索 在去标题的时候,对话框主题被去掉了,有点丑,现在既要有新版本的对话框又不显示标题 把清单文件中activity节点的主题去掉 进入到application节点的样式设置文件里面,添加一句 <item name="android:windowNoTitle">true</item> 设置点返回和空白地方对话框不消失 调用AlertDialog.Builer对象的setCancelable(false),强制升级的时候