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的简单实现的更多相关文章

  1. Android 手机卫士--自定义组合控件构件布局结构

    由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. ...

  2. 安卓自定义组合控件--toolbar

    最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...

  3. Android自定义控件之自定义组合控件

    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...

  4. Android开发之自定义组合控件

    自定义组合控件的步骤1.自定义一个View,继承ViewGroup,比如RelativeLayout2.编写组合控件的布局文件,在自定义的view中加载(使用View.inflate())3.自定义属 ...

  5. 自定义组合控件,适配器原理-Day31

    自定义组合控件,适配器原理-Day31 mobile2.1 主页定义 手机上锁功能 1.弹出设置密码框. 手机下载进度 自定定义控件 控件的属性其实就是控件类一个属性设置属性调用类的set方法方法, ...

  6. Android Studio自定义组合控件

    在Android的开发中,为了能够服用代码,会把有一定共有特点的控件组合在一起定义成一个自定义组合控件. 本文就详细讲述这一过程.虽然这样的View的组合有一个粒度的问题.粒度太大了无法复用,粒度太小 ...

  7. Android中自定义组合控件

    Android中自定义控件的情况非常多,一般自定义控件可以分为两种:继承控件及组合控件.前者是通过继承View或其子类,重写方法实现自定义的显示及事件处理方式:后者是通过组合已有的控件,来实现结构的简 ...

  8. Android自定义控件之自定义组合控件(三)

    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...

  9. Android View体系(十)自定义组合控件

    相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

随机推荐

  1. visio连接线随形状移动自动伸缩

    粘附可保持形状和连接线彼此依附.粘附打开时,可在移动形状时保持连接线跟着一起移动.粘附关闭时,移动形状时连接线将不会跟着移动. 1.在“视图”选项卡上的“视觉帮助​​”组中,单击对话框启动器 . 2. ...

  2. ARM cortex-version

    cortex-M\A\R M microcontroller 微控制器   就是单片机 A application    应用及处理器   就是手机平板电脑等 R realtime 实时处理器  响应 ...

  3. Asp.Net Zero通用打印实现

    Asp.Net Zero是一款非常优秀的web框架,可以用来快速构建业务系统.框架满足了业务系统所需的大部分通用功能,但是系统必须的打印报表功能一直没有实现.下面给大家介绍如何在zero中集成打印功能 ...

  4. 两步创建vue全局组件

    import Login from './Login' export default { install: function(Vue){ Vue.component('Login', Login); ...

  5. 使用IDEA创建JavaWeb项目 部署本地tomcat并运行

    一.下载商业版IDEA 官方链接:https://www.jetbrains.com/idea/download/#section=windows 二.新建JavaWeb项目 1.在菜单栏找到File ...

  6. 锁&lock与latch

    锁是数据库系统区别于文件系统的一个关键特性.锁机制用于管理对共享资源的并发访问.Innodb不仅仅使用行锁,也会在数据库内部其它地方使用锁,从而允许对多种不同资源提供并发访问.如:操作缓冲池中的LRU ...

  7. 什么是JWT?Token与Session的区别?

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  8. STM32F103C8T6最小板搞定CMSIS-DAP和SWO功能

    转载:http://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=616081&extra=page%3D&am ...

  9. HDU 6033 - Add More Zero | 2017 Multi-University Training Contest 1

    /* HDU 6033 - Add More Zero [ 简单公式 ] | 2017 Multi-University Training Contest 1 题意: 问 2^n-1 有几位 分析: ...

  10. Python字符串运算符

    下表实例变量 a 值为字符串 "Hello",b 变量值为 "Python": 操作符 描述 实例 + 字符串连接 >>>a + b 'Hel ...