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/ 这 ...
随机推荐
- LED BIN code
在LED选型时,一开始我们都知道要选个某种颜色,在选个尺寸,但在到具体选的时候,就会被那些个各种各样的参数搞得迷糊,这个主要对一个最让人困惑的参数-BIN CODE做整理. BIN就是bining的缩 ...
- C语言程序设计第二次作业
一.学习内容 掌握关系运算符.逻辑运算符.条件运算符 掌握常用数学函数的用法 if语句(单分支,双分支和多分支) 用switch语句实现多分支 理解多个if语句,if...else if... 和if ...
- linux下内存泄露检测工具Valgrind介绍
目前在linux开发一个分析实时路况的应用程序,在联合测试中发现程序存在内存泄露的情况. 这下着急了,马上就要上线了,还好发现了一款Valgrind工具,完美的解决了内存泄露的问题. 推荐大家可以使用 ...
- MFC 屏幕截图方法
//获取当前屏幕的并且保存图片 LRESULT CFeetScanView::SaveViewBMP(WPARAM wParam, LPARAM lParam) { CRect rect; this- ...
- 微软Face API体验——人脸检测
微软推出了全新REST API,现在可免费获取密钥,大家可以赶快申请!申请地址:https://cn.projectoxford.ai/subscription 看了网站的API介绍,忍不住赶快体验一 ...
- 如何开发H5项目 -- 入门篇
前言 H5即HTML5,H5开发具有低成本.高效率.跨平台.研发周期短,用户接触成本低等特性. 一.开发环境 在开发一个H5项目之前,需要先搞好环境.主要有node.npm.gulp.bower.下面 ...
- SharePoint REST Create Folder
function createListFolder(siteUrl, listName, foldername) { var serverUrl = _spPageContextInfo.webAbs ...
- 修改SharePoint 2013中item Created by 信息
因为公司的系统有点小bug.额,要做点坏事,把系统没记上的东西偷偷补上去,但是item的created by变成了我(这怎么行,不能让别人知道我做了坏事,一定是隔壁小李干的! 懒得开visual st ...
- Nginx反向代理配置可跨域
由于业务需要,同一项目中的前端代码放在静态环境中,而后端代码放在tomcat中,但此时问题却出现了:前端使用ajax请求后端获取数据时出现如下报错 XMLHttpRequest cannot load ...
- javascript原始数据类型compareto引用数据类型--近3天不太会的地方
ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可变类型,其实这些叫法都是依据这两 ...