cathome 猫家 开发日记-自定义控件

概述

根本就是一句话“:  自定义一个类(group view的派生类),在构造函数中,生成view,并加入他们。   语句: this.addView(view); 所有的步骤,都是这句话的扩展和补充罢了。

一般的流程。

整个流程都好理解,就是属性是如何加载上去的。没有去认真研究。属性问题操作上就是感觉

one: 建立属性文件

two.在布局文件多加了一行 xmlns:custom="http://schemas.android.com/apk/res-auto"

three:好像这个时候。就可以在控件中填入自定义属性了。

four:后台 特性语句。就可以获得属性了。TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.arr_postComment)

感觉android 应该可以把这个做的不要那么抽象,直接在控件中加入属性集合的名字多好。让人好理解。

1.想下组合控件需要哪些子控件。

2.建立一个class ,继承于 FrameLayout,LinearLayout或者RelativeLayout 。 定义构造函数, 在函数中,加载xml布局或手写代码生成view。 加入view到这个类中(要注意的是我们的类也是一个view)。

3.一般有事件需要处理。那么采用回调来处理 。

4.一般需要给控件加入属性。那么建立一个attrs.xml属性集文件,即你要自定义控件的属性,

在使用空间的文件中。额外加入xmlns:custom="http://schemas.android.com/apk/res-auto"

在控件上。写custom:hint="测试属性" (虽然不会自动补全。但是是可以用的)

在代码中获得

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.arr_postComment);

String hint= typedArray.getString(R.styleable.arr_postComment_hint);

举例

自定义控件,布局文件

<?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="match_parent">
        <EditText android:id="@+id/tv_comment" android:layout_width="40dp" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="0dp" android:layout_marginRight="10dp" android:layout_toLeftOf="@id/tv_submit" android:background="@drawable/shape_rectangle_transparency1_corner_grey" android:hint="我觉得这种猫科动物..." android:lines="2" android:maxLength="30" android:paddingLeft="4dp" android:singleLine="false" android:textSize="14dp" />
        <TextView android:id="@+id/tv_submit" android:layout_width="40dp" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:background="@drawable/shape_rectangle_transparency1_corner_green" android:gravity="center" android:text="递交" />
</RelativeLayout>

属性文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="arr_postComment">
        <attr name="hint" format="string" />
        <attr name="btn_text" format="string"/>
    </declare-styleable>
    <declare-styleable name="arr_postComment2">
        <attr name="hint2" format="string" />
        <attr name="btn_text2" format="string"/>
    </declare-styleable>
</resources>

控件类

package com.android.linson.catshome.Control.adapter;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.android.linson.catshome.R;

import java.util.logging.Handler;

//<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
//        <EditText android:id="@+id/tv_comment" android:layout_width="40dp" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="0dp" android:layout_marginRight="10dp" android:layout_toLeftOf="@id/tv_submit" android:background="@drawable/shape_rectangle_transparency1_corner_grey" android:hint="我觉得这种猫科动物..." android:lines="2" android:maxLength="30" android:paddingLeft="4dp" android:singleLine="false" android:textSize="14dp" />
//              <TextView android:id="@+id/tv_submit" android:layout_width="40dp" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:background="@drawable/shape_rectangle_transparency1_corner_green" android:gravity="center" android:text="递交" />
//        </RelativeLayout>

public class SubmitCommentCustom extends RelativeLayout implements View.OnClickListener
{
    private EditText mComment;
    private TextView mSubmit;
    private OnSubmit mHandle;

    public SubmitCommentCustom(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        //load layout file 2.findcontrols 3.setup sub control 4. add each view

        View view=View.inflate(this.getContext(), R.layout.lsuipostcomment, null);
        mComment=view.findViewById(R.id.tv_comment);
        mSubmit=view.findViewById(R.id.tv_submit);

        mSubmit.setOnClickListener(this);
        this.addView(view);

        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.arr_postComment);

        String hint= typedArray.getString(R.styleable.arr_postComment_hint);
        String btntext=typedArray.getString(R.styleable.arr_postComment_btn_text);
        mComment.setHint(hint);
        mSubmit.setText(btntext);
    }

    @Override
    public void onClick(View v)
    {
        if(mHandle!=null)
        {
            String str=mComment.getText().toString();
            mHandle.OnSubmited(str);
        }
    }

    public void SetOnSubmit(OnSubmit onsubmit)
    {
        mHandle=onsubmit;
    }

    public interface OnSubmit
    {
        void OnSubmited(String someThing);
    }

}

使用范例-布局

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

        <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent">
            <com.android.linson.catshome.Control.adapter.SubmitCommentCustom custom:hint="测试属性"  custom:btn_text="提交" android:layout_width="match_parent" android:layout_height="40dp" android:id="@+id/postcomment" android:layout_margin="4dp" ></com.android.linson.catshome.Control.adapter.SubmitCommentCustom>
        </RelativeLayout>

</RelativeLayout>

使用范例-activity

mpost=findViewById(R.id.postcomment);
        mpost.SetOnSubmit(new SubmitCommentCustom.OnSubmit()
        {
            @Override
            public void OnSubmited(String someThing)
            {
                Log.i("DEBUG", "OnSubmited article: "+someThing);
            }
        });

原文地址:https://www.cnblogs.com/lsfv/p/9938031.html

时间: 2024-10-10 10:59:12

cathome 猫家 开发日记-自定义控件的相关文章

cathome 猫家 开发日记-底部导航

0.内容页没有采用常用的 fragment.  而是采用自认为更简单的直接继承方式. 1.使用继承来实现复用. 2.基类处理大页面布局和底部的导航显示以及逻辑. 3.采用线性布局.平分.tv居中.固定字体. 4.控件采用样式来集中属性.有分支的情况采用dranable  的selecter来处理.非常简洁明了. 视图布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and

cathome 猫家 开发日记-tablayout+viewpager+fragment

概述 1.tablayout.纯粹就是一个滑动菜单,只是多加一个事件,触发viewpager的滑动. 2.viewpage,是主角,一般是设定  adapter,在 adapter中,决定如何显示view,以及显示多少个view. 这里系统已经封装了一个adapter叫 fragmentadapter.转为针对view里面放fragment  的.并且主要方法为 public Fragment getItem(int i) 所以建立多个fragment  .并传递给adapter. 就可以.主体

cathome 猫家 开发日记-webservice服务 ,生成json.

概述,采用熟悉的c# 语言. 1.用asmx .微软的web服务的标准格式.方便. 2.由方法生成json字符.只是利用ms 的框架而已. 配置文档. <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> &l

微信小程序开发日记——高仿知乎日报(上)

本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教程分为以下三篇 微信小程序开发日记--高仿知乎日报(上) 微信小程序开发日记--高仿知乎日报(中) 微信小程序开发日记--高仿知乎日报(下) 三篇分别讲不同的组件和功能块 这篇要讲 API分析 启动页 轮播图 日报列表 浮动按钮 侧滑菜单 API分析 以下是使用到的具体API,更加详细参数和返回结

车联网开发日记4

今天是车联网开发的第四天,继续昨天的进展,对项目的主要功能方面的代码进行学习和整理,今天主要是百度地图的显示和定位,和android 服务端的实现.而且我们规定了编码项目的api和android的版本. 百度地图的显示和定位都可以实现,但是由于电脑安卓虚拟机无法连接网路,所以无法在安卓虚拟机中实现,但是我们在真机上验证,可以实现(需要连接网路). 地图API的应用查看(车联网开发日记2) android服务端的搭建主要有两种方法:xml格式的webservice,json格式的webservic

【Android开发日记】妙用 RelativeLayout 实现3 段布局

在设计过程中,我们经常会遇到这样的需求: 把一条线3控制,左对齐左控制,右侧控制右对齐,中间控制,以填补剩余空间. 或者一列内放3个控件,上面的与顶部对齐,以下的沉在最底部,中间控件是弹性的.充满剩余空间. 情况一:水平布局 图示: 这是第一种情形.因为涉及到ImageView.想保持图片原比例不便使用LinearLayout的weight属性. 解决的方法: 1.外层套一个RelativeLayout 2.三个控件分别装进3个LinearLayout中.假如id分别为leftlayout,mi

【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)

全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdict开发日记:基于linux的简明英汉字典(三) [原创]shadowebdict开发日记:基于linux的简明英汉字典(四) 项目的github地址 承接上文. 现在来进行response模块的开发. 这一模块所完成的任务是,如果本地的词库中没有用户需要查询的词汇,那么就去网络上寻找到相应的词条作为

【原创】shadowebdict开发日记:基于linux的简明英汉字典(四)

全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdict开发日记:基于linux的简明英汉字典(三) [原创]shadowebdict开发日记:基于linux的简明英汉字典(四) 项目的github地址 实习的工作都这么忙,真是的.. 好不容易有时间写点博客,一鼓作气完成算了 承接上文 本文完成对本地数据库模块的开发. 由于只是非常轻量级的应用,就不劳

【Android的从零单排开发日记】之入门篇(四)——Android四大组件之Activity

在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页面类似.当然,这种相似性主要体现在设计思想上.在具体实现方面,Android的Activity组件有自己的设计规范,同时,它能够更简便地使用线程.文件数据等本地资源. 一.Activity 的生命周期 Activity 的生命周期是被以下的函数控制的. 1 public class Activity