1. package com.loaderman.settingitemviewdemo;
  2.  
  3. import android.os.Bundle;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.view.View;
  6.  
  7. public class MainActivity extends AppCompatActivity {
  8.  
  9. private SettingItemView siv1;
  10. private SettingItemView siv2;
  11. private SettingItemView siv3;
  12.  
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. siv1 = (SettingItemView) findViewById(R.id.siv_test1);
  18. siv2 = (SettingItemView) findViewById(R.id.siv_test2);
  19. siv3 = (SettingItemView) findViewById(R.id.siv_test3);
  20. siv1.setTitle("测试1");
  21. siv1.setToggleOn(true);
  22. siv2.setToggleOn(false);
  23.  
  24. siv1.setOnClickListener(new View.OnClickListener() {
  25. @Override
  26. public void onClick(View v) {
  27. siv1.toggle();
  28. }
  29. });
  30. siv2.setOnClickListener(new View.OnClickListener() {
  31. @Override
  32. public void onClick(View v) {
  33. if (siv2.isToggleOn()) {
  34. siv2.setToggleOn(false);
  35. } else {
  36. siv2.setToggleOn(true);
  37. }
  38.  
  39. }
  40. });
  41. siv3.setOnClickListener(new View.OnClickListener() {
  42. @Override
  43. public void onClick(View v) {
  44.  
  45. }
  46. });
  47. }
  48. }
  1. package com.loaderman.settingitemviewdemo;
  2.  
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.view.View;
  6. import android.widget.ImageView;
  7. import android.widget.RelativeLayout;
  8. import android.widget.TextView;
  9.  
  10. /**
  11. *
  12. * <p/>
  13. * 如果一个控件A包含了控件B, 那么A就是B的父控件, B是A的子控件; 和继承没有任何关系, 只是一种称谓而已.
  14. * <p/>
  15. * 自定义组合控件:
  16. * <p/>
  17. * 1. 写一个类继承ViewGroup(LinearLayout, RelativeLayout)
  18. * 2. 给当前空布局添加布局对象View.inflate(getContext(), R.layout.setting_item_view, this);
  19. * 3. 添加方法, 修改标题和背景
  20. * 4. 维护开关状态, boolean isOpen, 点击控件,切换开关状态,并更新开关图片
  21. *
  22. * 自定义属性:
  23. * 1. 在values中创建attrs.xml文件, 配置自定义属性
  24. * 2. 在布局文件中声明命名空间, 并给相关控件配置自定义属性
  25. * 3. 在自定义控件中, 从属性集合中获取自定义属性,并更新相关控件
  26. */
  27. public class SettingItemView extends RelativeLayout {
  28.  
  29. private TextView tvTitle;
  30. private ImageView ivToggle;
  31.  
  32. private boolean isOpen = false;//标记当前开关状态
  33.  
  34. private static final String NAMESPACE = "http://schemas.android.com/apk/res-auto";
  35.  
  36. public SettingItemView(Context context) {
  37. this(context, null);
  38. }
  39.  
  40. public SettingItemView(Context context, AttributeSet attrs) {
  41. this(context, attrs, -1);
  42. }
  43.  
  44. public SettingItemView(Context context, AttributeSet attrs, int defStyleAttr) {
  45. super(context, attrs, defStyleAttr);
  46. initView();
  47.  
  48. //1.从AttributeSet中取出自定义的属性
  49. String title = attrs.getAttributeValue(NAMESPACE, "title");
  50. int bgId = attrs.getAttributeIntValue(NAMESPACE, "bg", 0);//0,1,2
  51. boolean showToggle = attrs.getAttributeBooleanValue(NAMESPACE, "show_toggle", true);
  52.  
  53. //2.根据自定义属性的值更新相关控件
  54. setTitle(title);//修改标题
  55.  
  56. //修改背景
  57. switch (bgId) {
  58. case 0:
  59. setBackgroundResource(R.drawable.first_selector);
  60. break;
  61. case 1:
  62. setBackgroundResource(R.drawable.middle_selector);
  63. break;
  64. case 2:
  65. setBackgroundResource(R.drawable.last_selector);
  66. break;
  67. }
  68.  
  69. //控制开关的显示和隐藏
  70. ivToggle.setVisibility(showToggle ? VISIBLE : GONE);
  71.  
  72. }
  73.  
  74. private void initView() {
  75. //给当前空布局添加布局对象
  76. //A view group that will be the parent
  77. //参3: 如果是null, 表示加载出的布局对象没有父控件, 绝大部分情况下都传null
  78. //如果是this,代表在加载布局对象时, 以当前的SettingItemView为父控件; 这样写也可以实现给SettingItemView填充布局的效果
  79. View view = View.inflate(getContext(), R.layout.setting_item_view, this);
  80. //addView(view);
  81.  
  82. tvTitle = (TextView) view.findViewById(R.id.tv_title);
  83. ivToggle = (ImageView) view.findViewById(R.id.iv_toggle);
  84. }
  85.  
  86. //公开一个方法,供外界修改标题
  87. public void setTitle(String title) {
  88. tvTitle.setText(title);
  89. }
  90.  
  91. //获取当前开关状态
  92. public boolean isToggleOn() {
  93. return isOpen;
  94. }
  95.  
  96. //修改当前开关状态
  97. public void setToggleOn(boolean isOpen) {
  98. this.isOpen = isOpen;
  99. System.out.println("当前开关状态:" + isOpen);
  100. //修改开关图片
  101. ivToggle.setImageResource(isOpen ? R.drawable.on : R.drawable.off);
  102. }
  103.  
  104. //如果开,则关; 如果关,则开
  105. public void toggle() {
  106. setToggleOn(!isOpen);
  107. }
  108. }

自定义属性.在values/下新建attrs.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="SettingItemView">
  4. <!--自定义标题属性-->
  5. <attr name="title" format="string"/>
  6. <!--自定义背景属性, 枚举-->
  7. <attr name="bg">
  8. <enum name="first" value="0" />
  9. <enum name="middle" value="1" />
  10. <enum name="last" value="2" />
  11. </attr>
  12.  
  13. <!--自定义是否显示开关的属性-->
  14. <attr name="show_toggle" format="boolean"/>
  15.  
  16. </declare-styleable>
  17.  
  18. </resources>

activtity_main.xml,使用自定义属性记得添加命名空间

  1. xmlns:YOU_NAME="http://schemas.android.com/apk/res-auto"
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:loaderman="http://schemas.android.com/apk/res-auto"
  5. xmlns:tools="http://schemas.android.com/tools"
  6. android:id="@+id/activity_main"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:orientation="vertical"
  10. android:padding="5dp"
  11. tools:context="com.loaderman.settingitemviewdemo.MainActivity">
  12.  
  13. <com.loaderman.settingitemviewdemo.SettingItemView
  14. android:id="@+id/siv_test1"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. loaderman:bg="first"
  18. />
  19. <com.loaderman.settingitemviewdemo.SettingItemView
  20. android:id="@+id/siv_test2"
  21. android:layout_width="match_parent"
  22. android:layout_height="wrap_content"
  23. loaderman:title="测试2"
  24. loaderman:bg="middle"
  25. />
  26.  
  27. <com.loaderman.settingitemviewdemo.SettingItemView
  28. android:id="@+id/siv_test3"
  29. android:layout_width="match_parent"
  30. android:layout_height="wrap_content"
  31. loaderman:bg="last"
  32. loaderman:title="测试3"
  33. loaderman:show_toggle="false"
  34. />
  35. </LinearLayout>

setting_item_view.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content"
  6. android:paddingBottom="10dp"
  7. android:paddingLeft="5dp"
  8. android:paddingRight="5dp"
  9. android:paddingTop="10dp"
  10. >
  11.  
  12. <TextView
  13. android:id="@+id/tv_title"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_centerVertical="true"
  17. android:textColor="@color/black"
  18. android:textSize="18sp"
  19. />
  20.  
  21. <ImageView
  22. android:id="@+id/iv_toggle"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:layout_alignParentRight="true"
  26. android:layout_centerVertical="true"
  27. android:src="@drawable/off"
  28. />
  29.  
  30. </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. 怎么处理Win7电脑打开软件速度慢的情况?

    很多使用Win7系统的用户都会发现这么一个问题,就是电脑在使用过一段时间后,打开一个应用软件的速度就会变慢,非常耽误时间.下面就和大家分享一个解决Win7系统应用软件打开速度慢的小技巧. Win7系统 ...

  2. Samba编码设置方法

    弟管理學校的網頁伺服器,該伺服器也同時是大家的分享檔案集散中心,是以Linux架設起來的,該伺服器以 Unicode 作為系統編碼,而其他Windows系統則是big5(MS950)編碼,最近我要讓另 ...

  3. Delphi MSComm控件事件的介绍

  4. shutdown immediate 持久无法关闭数据库之解决方案

    问题引出:测试环境,进行oralce的shutdown immediate,等待时间很长,长的无法等待 ORACLE shutdown 过程: 1.shutdown normal(正常关闭方式):阻止 ...

  5. java线程基础巩固---线程ID,优先级

    这里学习Thread的两个比较简单的API,直接上代码: 线程ID: 那它的生成规则是?直接看源码: 那为什么目前打印是9呢?然后在jvm启动的时候就已经创建了8个线程?继续用jconsole来验证一 ...

  6. 配置LANMP环境(7)-- 配置nginx反向代理,与配置apache虚拟主机

    一.配置nginx反向代理 1.修改配置文件 vim /etc/nginx/nginx.conf 在35行http下添加一下内容: include /data/nginx/vhosts/*.conf; ...

  7. Windows下Redis如何永久更改密码

    公司使用的是Spring-session-redis 需要给Redis配置一个密码 本来我配置密码的方法是 先打开Redis服务 在采用 命令 CONFIG SET requirepass " ...

  8. P4294 [WC2008]游览计划 (斯坦纳树)

    题目链接 差不多是斯坦纳树裸题,不过边权化成了点权,这样在合并两棵子树时需要去掉根结点的权值,防止重复. 题目还要求输出解,只要在转移时记录下路径,然后dfs一遍就好了. #include<bi ...

  9. python的序列化模块

    最近机器学习的模型需要序列化和反序列化,因为写个博客总结一下几个模型和数据等序列化的模块.

  10. lombok使用及常用注解

    简介 大部分项目中都必不可少的包含数据库实体(Entity).数据载体(dto,dataObject),而这两部分都包含着大量的没有业务逻辑的setter.getter.空参构造,同时我们一般要复写类 ...