美文网首页
自定义组合控件的一般步骤

自定义组合控件的一般步骤

作者: Maybe_G | 来源:发表于2017-12-11 22:00 被阅读0次

说明:本文以cardview为例来记录一下自定义组合控件的一般步骤。效果如下图所示:

image.png

该自定义组合空间是由两个textview和一个switch控件组合而成的。

1.新建setting_item_cardview.xml布局文件。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:layout_marginTop="35dp"
        app:cardCornerRadius="4dp">

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/text_item_up"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:layout_marginLeft="20dp"

                android:textSize="14dp"
                android:textColor="#000000"
                android:text="设置自动更新" />

            <TextView
                android:id="@+id/text_item_down"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/text_item_up"
                android:layout_marginLeft="20dp"
                android:layout_marginBottom="10dp"
                android:textColor="#66000000"
                android:text="当前自动更新已经关闭" />

            <Switch
                android:id="@+id/switch_item"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_margin="10dp" />

        </RelativeLayout>


    </android.support.v7.widget.CardView>

</RelativeLayout>

2.新建一个属性XML

在value目录下按以下格式新建一个attrs.xml文件。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="SwitchView">
        <attr name="title" format="string"/>
        <attr name="switch_on" format="string"/>
        <attr name="switch_off" format="string"/>
    </declare-styleable>
</resources>

这个意思就是制定你自定义空间里面有哪些属性,类似于TextView中的text属性。

注意:SwitchView要与第3步的类名一致;format中string是小写。

3.新建一个类继承LinearLayout或RelativeLayout

/**
 * Class Name:SwitchView
 * Class desc. :自定义控件
 * date    : 2017/12/11
 * author   : Maybe
 */

public class SwitchView extends LinearLayout {

    public Switch sw;
    private TextView tv_switchInfo;
    private String title;
    private String switchOn;
    private String switchOff;
    private TextView tv_title;

    //在代码中实例化的时候使用
    public SwitchView(Context context) {
        super(context);
        initView(context);
    }
    //在布局文件实例化的时候使用
    public SwitchView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView(context);
        title = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "title");
        switchOff = attrs.getAttributeValue(nameSpace, "switch_off");
        tv_title.setText(title);
        tv_switchInfo.setText(switchOff);

    }
    private void initView(Context context) {
        //inflate :把布局文件转化成view
        //最后一个参数:添加布局文件的父类,也就是把布局文件挂载在SwitchLayout上
        View.inflate(context, R.layout.setting_item_cardview, this);
        sw = (Switch) findViewById(R.id.switch_item);
        tv_title = findViewById(R.id.text_item_up);
        tv_switchInfo = (TextView) findViewById(R.id.text_item_down);
    }
    public void setSwitchOnClickListener(CompoundButton.OnCheckedChangeListener listener) {
        sw.setOnCheckedChangeListener(listener);
    }
    /**
     * fun desc. :为自定义控件中的textView设置文字
     * params.   :
     *
     * @return :
     */
    public void setText(String string) {
        tv_switchInfo.setText(string);
    }
}

其中有以下两句代码需要解释一下:

        title = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "title");
        switchOff = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "switch_off");
        tv_title.setText(title);
        tv_switchInfo.setText(switchOff);

这两句的意思是我们定义一个命名空间"http://schemas.android.com/apk/res-auto",然后从这个命名空间里面获取title和switch_off这两个属性,类似TextView的text属性。 然后将获取到的String显示出来。

4.新建一个布局,将建好的自定义控件使用起来

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:maybe="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.maybe.android.mobilesafe.view.SwitchView
        android:id="@+id/slt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        maybe:switch_off="当前自动更新已经关闭"
        maybe:switch_on="当前自动更新已经开启"
        maybe:title="设置自动更新">
    </com.maybe.android.mobilesafe.view.SwitchView>

    <com.maybe.android.mobilesafe.view.SwitchView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        maybe:switch_off="这是自定义控件2"
        maybe:title="这是自定义控件">
    </com.maybe.android.mobilesafe.view.SwitchView>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是TextView的控件"
        android:layout_marginLeft="20dp"/>

</LinearLayout>
xmlns:maybe="http://schemas.android.com/apk/res-auto",

注意

  1. maybe是自己随便命名的,后面的属性也是按照这个来引用
  2. 新版本的Android Studio后面是接res-auto,老版本的是res/"包名"
        maybe:switch_off="这是自定义控件2"
        maybe:title="这是自定义控件"

5. 预览一下效果

image.png

搞定!

相关文章

  • Android入门06 -- 自定义控件

    自定义组合控件 将几个子控件组合在一起,形成一个可复用的新的组合控件,自定义组合控件一般继承自RelativeLa...

  • 自定义组合控件的一般步骤

    说明:本文以cardview为例来记录一下自定义组合控件的一般步骤。效果如下图所示: 该自定义组合空间是由两个te...

  • 组合自定义控件的步骤详解

    Android 步骤: 1 自定义组合控件的布局settint_view.xml 2 创建一个自定义子和控件的类S...

  • 自定义View之侧滑菜单

    側拉菜单一:是一个组合控件,用viewgroup 关心,onmesure和onlayout方法步骤:1.自定义控件...

  • 学习笔记(二)

    自定义控件 继承现有的控件,如textview,edittext, 继承容器控件,一般是几个控件组合起来组成一个新...

  • Android 学习笔记 自定义控件之排行控件

    自定义控件,从字面意思来看我的理解是根据自己的想法定义控件。自定义控件一般有三种类型: 组合原生控件实现自己想要的...

  • android2019-01-03

    1.View的绘制流程自定义控件:1、组合控件。这种自定义控件不需要我们自己绘制,而是使用原生控件组合成的新控件。...

  • 11-自定义组合控件以及使用

    一、自定义组合控件介绍 开发中,为了使用的方便,经常把一些控件组合成一个控件,那样就成为了我们的自定义组合控件,严...

  • XIB和代码自定义控件的步骤

    title : XIB和代码自定义控件的步骤category : UI 代码和XIB自定义控件和封装子控件的步骤...

  • Android组合控件详解 & 自定义属性

    组合控件详解 & 自定义属性 摘录来源:极客学院WiKi 组合控件是自定义控件的一种,只不过它是由其他几个原生控件...

网友评论

      本文标题:自定义组合控件的一般步骤

      本文链接:https://www.haomeiwen.com/subject/rqmwixtx.html