自定义控件:

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学习十二:自定义控件学习的更多相关文章

  1. 201521123061 《Java程序设计》第十二周学习总结

    201521123061 <Java程序设计>第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对 ...

  2. 201521123072《java程序设计》第十二周学习总结

    201521123072<java程序设计>第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象 ...

  3. 201521123038 《Java程序设计》 第十二周学习总结

    201521123038 <Java程序设计> 第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student ...

  4. 201771010134杨其菊《面向对象程序设计java》第十二周学习总结

    第十二周学习总结 第一部分:理论知识 内容概要: AWT与Swing简介:框架的创建:图形程序设计: 显示图像: 1.AWT组件: 2.Swing 组件层次关系 3 .AWT与Swing的关系:大部分 ...

  5. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  6. 201871010123-吴丽丽《面向对象程序设计(Java)》第十二周学习总结

    201871010123-吴丽丽<面向对象程序设计(Java)>第十二周学习总结 项目 内容 这个作业属于哪个课程  https://www.cnblogs.com/nwnu-daizh/ ...

  7. 201871010106-丁宣元 《面向对象程序设计(java)》第十二周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第十二周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...

  8. 201271050130-滕江南-《面向对象程序设计(java)》第十二周学习总结

    201271050130-滕江南-<面向对象程序设计(java)>第十二周学习总结 项       目 内      容 这个作业属于哪个课程 https://www.cnblogs.co ...

  9. 201871010111-刘佳华《面向对象程序设计(java)》第十二周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十二周学习总结 实验十   集合与GUI初步 实验时间 2019-11-14 第一部分:基础知识总结 第九章知识总结 1. ...

  10. 201871010109-胡欢欢《面向对象程序设计(java)》第十二周学习总结

    201871010109-胡欢欢<面向对象程序设计(java)>第十二周学习总结   内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...

随机推荐

  1. 利用certutil.exe实现在批处理(bat)中嵌入可执行文件或者各种媒体、图片之类二进制文件的简单方法!

    实际上利用certutil.exe 把二进制文件(包括各种文件,exe可执行程序,图片,声音,mp3) 经过base64编码为文本,可以实现把这些文件嵌入到批处理代码中. 有什么用?: 举个例子,批处 ...

  2. 【转】jQuery获取Select option 选择的Text和Value

    获取一组radio被选中项的值:var item = $('input[name=items][checked]').val();获取select被选中项的文本:var item = $(" ...

  3. 《C++primer》v5 第5章 语句 读书笔记 习题答案

    5.1 空语句只有一个";".如果什么也不想做可以使用空语句. 5.2 用花括号{}括起来的叫块,也叫复合语句.有多条语句作用在同一个作用域时,需要用花括号括起来. 5.3 降低了 ...

  4. Three.js typescript definitely typed 文件

    最近学习three.js,想用typescript编写代码,去http://definitelytyped.org/找了一圈没有发现three.js的definitely typed文件. 好吧,花了 ...

  5. VIM C++语法高亮配色

    因工作需求,必须在终端下远程下代码,vim打开cpp/h文件,看到一连串的字母就傻了,根本无法阅读. 后来才知道VIM这高大上的文本编辑器支持很多的功能,很多的功能.首先最基本的就是语法高亮配色 1. ...

  6. C# treeview 绑定数据 【转】

    private void bindTreeView1() { string sql = "select * from dm_category"; DataTable dt = db ...

  7. iOS 截图功能

    步骤: 当我们所需截的图的大小超过我们屏幕的大小时,可以用UIScrollView作为底图,这样就可以截图我们所需的大小,即 UIScrollView *scrollView = self.view. ...

  8. savedInstanceState的作用

    在activity的生命周期中,只要离开了可见阶段,或者说失去了焦点,activity就很可能被进程终止了!,被KILL掉了,,这时候,就需要有种机制,能保存当时的状态,这就是savedInstanc ...

  9. BigDecimal

    BigDecimal需要创建对象进行计算(用不同的方式做运算) BigDecimal num1 = new BigDecimal("5"): BigDecimal num2 = n ...

  10. JAVA(3)

    接口注意事项: 1.接口不能被实例化 2.接口中所有的方法都不能有主体  (不能有{ }) 3.一个类可以实现多个接口 4.接口中可以有变量<但变量不能用private和protected修饰& ...