自定义控件:

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. unity 发布web player版,网页打开报Failed to initialize player's 3D settings

    开始时我装的是unity 5.0.0b1,不知道在哪找的这个版本. web player 装的什么版本也忘了. 最后卸载了web player,重新安装web player并另外安装一个unity4. ...

  2. web浏览器兼容简要整理

    ajax的创建 if (window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); } else { //IE6及其以下版本浏览器 var xhr ...

  3. 数据存储之CoreData

    #import "ViewController.h" #import <CoreData/CoreData.h> #import "Person.h" ...

  4. patchca验证码的使用

    /** * 生成验证码 */ private static RandomFontFactory ff = null; // 自定义验证码图片背景 private static MyCustomBack ...

  5. 通过声明Attribute属性改变不同类的输出效果

    ConsoleApplication--控制台应用程序 首先创建基类: using System; using System.Collections.Generic; using System.Lin ...

  6. angularjs的简单应用(一)

    AngularJS是为了克服html在构建应用上的不足而设计的.HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了. AngularJS使用了不同的方法,它尝试去 ...

  7. controller 解析xml文件

    public ActionResult Index() { XmlReader reader = null; try { //获取路径 ..\TGB.Common.Message\TGB.Common ...

  8. Using dijit/Destroyable to build safe Components

    In today's long-lived JavaScript apps it is essential to not introduce memory leaks within your cust ...

  9. js继承相关

    这几天看到一篇文章详解Javascript的继承实现,发现js还是很深奥的,比如call.apply.prototype这些,问起来我也能说的头头是道的,但是看到一些复杂的代码有的时候还是会迷糊,所以 ...

  10. 深入理解ecshop2.7.3整合discuzX3.2(97%的完美方案)

    转载http://blog.csdn.net/squallleonheart/article/details/39555259 ecshop整合discuzX3.2 ecshop安装包:ECShop_ ...