Android学习十二:自定义控件学习
自定义控件:
1.定义控件的属性,atts.xml
2.代码实现自定义控件的控制
3.引用该控件
首先定义相关的属性
<?xml version="1.0" encoding="utf-8"?>
<resources> <declare-styleable name="TopBar">
<!-- title提示已经定义,那就直接引用 -->
<attr name="title" />
<attr name="titleTextSize" format="string" />
<attr name="titleTextColor" format="reference|color" />
<attr name="leftTextColor" format="reference|color" />
<attr name="leftBgColor" format="reference|color" />
<attr name="leftText" format="string" />
<attr name="rightTextColor" format="color" />
<attr name="rightBgColor" format="reference|color" />
<attr name="rightText" format="string" />
</declare-styleable> </resources>
然后,设置控件布局
package org.tonny; import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView; public class TopBar extends RelativeLayout
{
//自定义控件中包含的控件
private Button mLeftButton;
private Button mRightButton;
private TextView mTextView; //自定义控件布局的设置
private LayoutParams mLeftParams;
private LayoutParams mRightParams;
private LayoutParams mCenterParams; //定义成员,与atts中的对应,对应mLeftButton
private int mLeftTextColor;
private Drawable mLeftBackground;
private String mLeftText; //对应mRightButton
private int mRightTextColor;
private Drawable mRightBackground;
private String mRightText; //对应mTextView
private int mTitleTextSize;
private int mTitleTextColor;
private String mTitle; //定义接口,用于回调事件
private onTopbarClickListener mLlistener; public TopBar(Context context, AttributeSet attrs)
{
super(context, attrs); // 获取属性,将xml中值映射到ta中
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TopBar); mLeftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
mLeftBackground = ta.getDrawable(R.styleable.TopBar_leftBgColor);
mLeftText = ta.getString(R.styleable.TopBar_leftText); mRightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
mRightBackground = ta.getDrawable(R.styleable.TopBar_rightBgColor);
mRightText = ta.getString(R.styleable.TopBar_rightText); mTitleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, 0);
mTitle = ta.getString(R.styleable.TopBar_title); // 注意回收,这个很重要
ta.recycle(); // 设置相应控件的属性
mLeftButton = new Button(context);
mLeftButton.setTextColor(mLeftTextColor);
mLeftButton.setBackgroundDrawable(mLeftBackground);
mLeftButton.setText(mLeftText); //注意这个地方的使用
mLeftButton.setOnClickListener(new OnClickListener()
{ @Override
public void onClick(View v)
{
mLlistener.leftClick(); }
}); mRightButton = new Button(context);
mRightButton.setTextColor(mRightTextColor);
mRightButton.setBackgroundDrawable(mRightBackground);
mRightButton.setText(mRightText);
mRightButton.setOnClickListener(new OnClickListener()
{ @Override
public void onClick(View v)
{
mLlistener.rightClick(); }
}); mTextView = new TextView(context); // 这个地方使用浮点数的形式会出错,不知道为啥
mTextView.setTextSize(mTitleTextSize);
mTextView.setTextColor(mTitleTextColor);
mTextView.setText(mTitle);
mTextView.setGravity(Gravity.CENTER); // 将控件添加到viewgroup中 // 添加左按钮到布局中
mLeftParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mLeftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);
addView(mLeftButton, mLeftParams); // 添加右按钮到布局中
mRightParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mRightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);
addView(mRightButton, mRightParams); // 添加标题到布局中
mCenterParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
mCenterParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);
addView(mTextView, mCenterParams);
} public void setOnTopbarClickListener(onTopbarClickListener listener)
{
mLlistener = listener;
}
}
接口代码
package org.tonny; //定义接口,用于回调
public interface onTopbarClickListener
{
public void leftClick(); public void rightClick();
}
其次,引用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bar="http://schemas.android.com/apk/res/org.tonny"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" > <!-- 注意 xmlns:bar="http://schemas.android.com/apk/res/org.tonny" 命名空间的使用,bar是引入的控件的别名,可以自己定义因为需要引用自定义的leftBgColor,所以需要设置这个引用空间 --> <org.tonny.TopBar
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="40dp"
bar:leftBgColor="#F00FFF"
bar:leftText="Back"
bar:leftTextColor="#FFFFFF"
bar:rightBgColor="#F00FFF"
bar:rightText="More"
bar:rightTextColor="#FFFFFF"
bar:title="自定义控件测试"
bar:titleTextColor="#00FFFF"
bar:titleTextSize="40sp" >
</org.tonny.TopBar> </RelativeLayout>
最后,测试
package org.tonny; import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast; public class MainActivity extends Activity
{
private TopBar mTopbar;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //获取topbar控件
mTopbar = (TopBar) findViewById(R.id.topBar); //设置mTopbar的点击事件
mTopbar.setOnTopbarClickListener(new onTopbarClickListener()
{ @Override
public void rightClick()
{
Toast.makeText(MainActivity.this, "more clicked", Toast.LENGTH_SHORT).show(); } @Override
public void leftClick()
{
Toast.makeText(MainActivity.this, "back clicked", Toast.LENGTH_SHORT).show(); }
});
}
}
Android学习十二:自定义控件学习的更多相关文章
- 201521123061 《Java程序设计》第十二周学习总结
201521123061 <Java程序设计>第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对 ...
- 201521123072《java程序设计》第十二周学习总结
201521123072<java程序设计>第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象 ...
- 201521123038 《Java程序设计》 第十二周学习总结
201521123038 <Java程序设计> 第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student ...
- 201771010134杨其菊《面向对象程序设计java》第十二周学习总结
第十二周学习总结 第一部分:理论知识 内容概要: AWT与Swing简介:框架的创建:图形程序设计: 显示图像: 1.AWT组件: 2.Swing 组件层次关系 3 .AWT与Swing的关系:大部分 ...
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- 201871010123-吴丽丽《面向对象程序设计(Java)》第十二周学习总结
201871010123-吴丽丽<面向对象程序设计(Java)>第十二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871010106-丁宣元 《面向对象程序设计(java)》第十二周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第十二周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...
- 201271050130-滕江南-《面向对象程序设计(java)》第十二周学习总结
201271050130-滕江南-<面向对象程序设计(java)>第十二周学习总结 项 目 内 容 这个作业属于哪个课程 https://www.cnblogs.co ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十二周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十二周学习总结 实验十 集合与GUI初步 实验时间 2019-11-14 第一部分:基础知识总结 第九章知识总结 1. ...
- 201871010109-胡欢欢《面向对象程序设计(java)》第十二周学习总结
201871010109-胡欢欢<面向对象程序设计(java)>第十二周学习总结 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...
随机推荐
- GoldenGate Studio 12.2.1.1发布
OGG studio是一款图形化OGG配置部署产品,其主要特性:1. 逻辑层面设计OGG,不需要了解OGG细节:2. 最值实践加快常用场景的配置:3. 使用拖拉映射,自动匹配源和目标对象:4. 一键部 ...
- Sprint 2(第一天)
Sprint 2计划会议: 目标: 1.实现用户模块的权限控制,能够进行用户登录的功能 2.对菜单模块实现增加菜单列表详情,修改菜单列表详情,删除菜单列表详情,查询菜单列表详情的功能 3.实现菜品分类 ...
- JavaWeb--Servlet部分笔记
1.集群:数万个服务器协同工作 2.web应用核心组件:jsp和servlet(属于门户),都在web容器中执行 3.web客户端发http请求(大的字符串)给web服务器:web服务器根据头信息来定 ...
- entity framework 新手入门篇(1.5)-lambda表达式与linq
在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以la ...
- Java网络编程及安全
一.实验内容: 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者 ...
- setTimeout用于取消多次执行mouseover或者mouseenter事件,间接实现hover的悬停加载的效果.
Mouseenter在鼠标滑上去不会对其子元素也发生监听, Mouseover在鼠标滑上去会对其子元素发生监听. 所以对于事件的监听,我们要看需求,这里是对父元素的监听,不需要对子元素做监听.就用mo ...
- 使用 IDEA + Maven + Git 快速开发 JAVA或者Web 应用(转)
0-0 前言 最近和同事做爬虫,其中我主要遇到的问题是:同事在github上放了爬虫demo让我自己去下载,然后自己能搭好环境让整个项目跑起来去抓51job找工作数据.git上克隆一个项目下来,项目是 ...
- shader forge卡通渲染!
自从用了shader forge,妈妈我再也不写shader了...... 写了3种,分别用的顶点法线.法线贴图.顶点法线+法线贴图,然后还有自发光和受光两种模式,那就是6种了吧... 最后来一张sh ...
- mov和ldr/str的区别
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就 ...
- Thinkphp_View(1)循环输出
循环输出主要是使用volist和foreach标签输出. VOLIST volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使 ...