自定义组合控件SettingItemView的简单实现
package com.loaderman.settingitemviewdemo; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View; public class MainActivity extends AppCompatActivity { private SettingItemView siv1;
private SettingItemView siv2;
private SettingItemView siv3; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
siv1 = (SettingItemView) findViewById(R.id.siv_test1);
siv2 = (SettingItemView) findViewById(R.id.siv_test2);
siv3 = (SettingItemView) findViewById(R.id.siv_test3);
siv1.setTitle("测试1");
siv1.setToggleOn(true);
siv2.setToggleOn(false); siv1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
siv1.toggle();
}
});
siv2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (siv2.isToggleOn()) {
siv2.setToggleOn(false);
} else {
siv2.setToggleOn(true);
} }
});
siv3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { }
});
}
}
package com.loaderman.settingitemviewdemo; import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView; /**
*
* <p/>
* 如果一个控件A包含了控件B, 那么A就是B的父控件, B是A的子控件; 和继承没有任何关系, 只是一种称谓而已.
* <p/>
* 自定义组合控件:
* <p/>
* 1. 写一个类继承ViewGroup(LinearLayout, RelativeLayout)
* 2. 给当前空布局添加布局对象View.inflate(getContext(), R.layout.setting_item_view, this);
* 3. 添加方法, 修改标题和背景
* 4. 维护开关状态, boolean isOpen, 点击控件,切换开关状态,并更新开关图片
*
* 自定义属性:
* 1. 在values中创建attrs.xml文件, 配置自定义属性
* 2. 在布局文件中声明命名空间, 并给相关控件配置自定义属性
* 3. 在自定义控件中, 从属性集合中获取自定义属性,并更新相关控件
*/
public class SettingItemView extends RelativeLayout { private TextView tvTitle;
private ImageView ivToggle; private boolean isOpen = false;//标记当前开关状态 private static final String NAMESPACE = "http://schemas.android.com/apk/res-auto"; public SettingItemView(Context context) {
this(context, null);
} public SettingItemView(Context context, AttributeSet attrs) {
this(context, attrs, -1);
} public SettingItemView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(); //1.从AttributeSet中取出自定义的属性
String title = attrs.getAttributeValue(NAMESPACE, "title");
int bgId = attrs.getAttributeIntValue(NAMESPACE, "bg", 0);//0,1,2
boolean showToggle = attrs.getAttributeBooleanValue(NAMESPACE, "show_toggle", true); //2.根据自定义属性的值更新相关控件
setTitle(title);//修改标题 //修改背景
switch (bgId) {
case 0:
setBackgroundResource(R.drawable.first_selector);
break;
case 1:
setBackgroundResource(R.drawable.middle_selector);
break;
case 2:
setBackgroundResource(R.drawable.last_selector);
break;
} //控制开关的显示和隐藏
ivToggle.setVisibility(showToggle ? VISIBLE : GONE); } private void initView() {
//给当前空布局添加布局对象
//A view group that will be the parent
//参3: 如果是null, 表示加载出的布局对象没有父控件, 绝大部分情况下都传null
//如果是this,代表在加载布局对象时, 以当前的SettingItemView为父控件; 这样写也可以实现给SettingItemView填充布局的效果
View view = View.inflate(getContext(), R.layout.setting_item_view, this);
//addView(view); tvTitle = (TextView) view.findViewById(R.id.tv_title);
ivToggle = (ImageView) view.findViewById(R.id.iv_toggle);
} //公开一个方法,供外界修改标题
public void setTitle(String title) {
tvTitle.setText(title);
} //获取当前开关状态
public boolean isToggleOn() {
return isOpen;
} //修改当前开关状态
public void setToggleOn(boolean isOpen) {
this.isOpen = isOpen;
System.out.println("当前开关状态:" + isOpen);
//修改开关图片
ivToggle.setImageResource(isOpen ? R.drawable.on : R.drawable.off);
} //如果开,则关; 如果关,则开
public void toggle() {
setToggleOn(!isOpen);
}
}
自定义属性.在values/下新建attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="SettingItemView">
<!--自定义标题属性-->
<attr name="title" format="string"/>
<!--自定义背景属性, 枚举-->
<attr name="bg">
<enum name="first" value="0" />
<enum name="middle" value="1" />
<enum name="last" value="2" />
</attr> <!--自定义是否显示开关的属性-->
<attr name="show_toggle" format="boolean"/> </declare-styleable> </resources>
activtity_main.xml,使用自定义属性记得添加命名空间
xmlns:YOU_NAME="http://schemas.android.com/apk/res-auto"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:loaderman="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp"
tools:context="com.loaderman.settingitemviewdemo.MainActivity"> <com.loaderman.settingitemviewdemo.SettingItemView
android:id="@+id/siv_test1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
loaderman:bg="first"
/>
<com.loaderman.settingitemviewdemo.SettingItemView
android:id="@+id/siv_test2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
loaderman:title="测试2"
loaderman:bg="middle"
/> <com.loaderman.settingitemviewdemo.SettingItemView
android:id="@+id/siv_test3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
loaderman:bg="last"
loaderman:title="测试3"
loaderman:show_toggle="false"
/>
</LinearLayout>
setting_item_view.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="10dp"
> <TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:textColor="@color/black"
android:textSize="18sp"
/> <ImageView
android:id="@+id/iv_toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/off"
/> </RelativeLayout>
实现效果:

自定义组合控件SettingItemView的简单实现的更多相关文章
- Android 手机卫士--自定义组合控件构件布局结构
由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. ...
- 安卓自定义组合控件--toolbar
最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...
- Android自定义控件之自定义组合控件
前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...
- Android开发之自定义组合控件
自定义组合控件的步骤1.自定义一个View,继承ViewGroup,比如RelativeLayout2.编写组合控件的布局文件,在自定义的view中加载(使用View.inflate())3.自定义属 ...
- 自定义组合控件,适配器原理-Day31
自定义组合控件,适配器原理-Day31 mobile2.1 主页定义 手机上锁功能 1.弹出设置密码框. 手机下载进度 自定定义控件 控件的属性其实就是控件类一个属性设置属性调用类的set方法方法, ...
- Android Studio自定义组合控件
在Android的开发中,为了能够服用代码,会把有一定共有特点的控件组合在一起定义成一个自定义组合控件. 本文就详细讲述这一过程.虽然这样的View的组合有一个粒度的问题.粒度太大了无法复用,粒度太小 ...
- Android中自定义组合控件
Android中自定义控件的情况非常多,一般自定义控件可以分为两种:继承控件及组合控件.前者是通过继承View或其子类,重写方法实现自定义的显示及事件处理方式:后者是通过组合已有的控件,来实现结构的简 ...
- Android自定义控件之自定义组合控件(三)
前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...
- Android View体系(十)自定义组合控件
相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...
随机推荐
- while 循环 及 and or not
一 while 循环 语法: while 条件: 结果 如果条件为真,则直接执行结果,然后再次判断条件,直到条件是假,停止循环 结束循环: 1.改变条件 2.break 二 流程控制 break 和 ...
- linux基础—课堂随笔_03 SHELL脚本编程基础
shell脚本编程基础 条件选择:if语句 选择执行: 注意:if语句可嵌套 单分支 if(开头)判断条件:then条件为真的分支代码 fi(结尾) 双分支 if(开头)判断条件:then条件为真的分 ...
- Hive的视图和索引(九)
Hive的视图和索引 1.Hive Lateral View 1.基本介绍 Lateral View用于和UDTF函数(explode.split)结合来使用. 首先通过UDTF函数拆分成多行 ...
- vue+django前后端项目部署
一.python3的安装 1.安装python前的库环境: yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel ...
- 点击startup.bat启动tomcat出现乱码
找到tomcat目录下的/conf/logging.properties添加语句:java.util.logging.ConsoleHandler.encoding = GBK重启tomcat 问题解 ...
- AVL树的介绍和实现
一.AVL树 AVL树是一种自平衡二叉查找树,因此在了解AVL树之前先介绍一下平衡二叉树.所谓平衡二叉树即该树中的任一个节点的左子树和右子树高度差不会超过1.如下图左是平衡二叉树,而右图则不是.节点4 ...
- timestamp和datetime
datetime数据类型在MySQL之前占8个字节,5.6之后占5个字节,datetime的范围1000-01-01 00:00:00------9999-12-31 23:59:59,格式采用YYY ...
- 解决Android无法正常https://dl.google.com/dl/android/maven2/com/的办法
最近需要进行移动开发,在安装Android Studio时,遇到了很纠结的问题,安装一直很不顺利.经过2天的百度搜索终于是找到解决的办法. 问题花了2天的时间才从茫茫大海中找到确切的答案.所以必须开个 ...
- mysql 模拟oracle中的序列
因业务需要,把oracle 数据据转成mysql,同时oracle中程序本来一直在用 序列, mysql中没有,所以需要在mysql中新建一个表进行模拟, CREATE TABLE `sequence ...
- Java-JsonUtil工具类
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; i ...