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. 如何解决Win10电脑网速慢的问题?

    很多Win10系统用户反映自己的电脑配置并不算低,却比有些旧电脑上网速度还要慢,不知道是什么原因. 其实,除了运营商网速的原因外,我们的电脑设置也会对网速有所影响.下面好系统U盘启动就来介绍一个Win ...

  2. python面向编程;类的绑定与非绑定方法、反射、内置方法

    一.类的绑定与非绑定方法 ''' 类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法: 在类中定义函数没有被任何 ...

  3. PHP提取富文本字符串中的纯文本,并进行进行截取

    this is my first markdown article,i hope you like it /** * 提取富文本字符串的纯文本,并进行截取; * @param $string 需要进行 ...

  4. java8 stream/optional个人测试demo记录

    备忘记录 package cc.ash; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConst ...

  5. regex正则

    1 正则表达式基本语法 两个特殊的符号^和$.他们的作用是分别指出一个字符串的开始和结束.例子如下: ^The:表示所有以”The”开始的字符串(”There”,”The cat”等): of des ...

  6. 喜大普奔!.NET界面控件DevExpress v19.2发布,快来下载体验

    DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...

  7. SQLite3的安装与使用

    下载地址:https://www.sqlite.org/download.html (下载相对应自已电脑的配置的数据库)(这里 我的电脑是 windows 64位操作系统) 下载完后 解压出来 sql ...

  8. Java之正则表达式来判断字符串中是否包含字母

    /** * 使用正则表达式来判断字符串中是否包含字母 * @param str 待检验的字符串 * @return 返回是否包含 * true: 包含字母 ;false 不包含字母 */ public ...

  9. Spring下的@Order和@Primary与javax.annotation-api下@Priority【Spring4.1后】等方法控制多实现的依赖注入(转)

    @Order 可以作用在类.方法.属性. 影响加载顺序. 若不加,spring的加载顺序是随机的. @Primary 当注入bean冲突时,以@Primary定义的为准. @Order是控制配置类的加 ...

  10. 关于redis的主从、哨兵、集群(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/c295477887/article/de ...