步骤一: 先在values 里 新建一个attrs.xml 来设置我们的属性值:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="TopBar" >
  4. <attr name="title" format="string"/>
  5. <attr name="titleTextSize" format="dimension"/>
  6. <attr name="titleTextColor" format="color"/>
  7. <attr name="leftText" format="string"/>
  8. <attr name="leftBackground" format="reference|color"/>
  9. <attr name="leftTextColor" format="color"/>
  10. <attr name="rightText" format="string"/>
  11. <attr name="rightBackground" format="reference|color"/>
  12. <attr name="rightTextColor" format="color"/>
  13.  
  14. </declare-styleable>
  15.  
  16. </resources>

步骤二: 新建Topbar类继承自RelaiveLayout :

  1. /**
  2. * Created by Ace on 2016/2/3.
  3. */
  4. public class Topbar extends RelativeLayout {
  5.  
  6. //声明我们需要的控件
  7. private Button leftButton,rightButton;
  8. private TextView tv_title;
  9.  
  10. private int leftTextColor;
  11. private String leftText;
  12. private Drawable leftBackground;
  13.  
  14. private int rightTextColor;
  15. private String rightText;
  16. private Drawable rightBackground;
  17.  
  18. private String title;
  19. private int titleTextColor;
  20. private float titleTextSize;
  21.  
  22. //4 定义布局属性
  23. private LayoutParams leftParams , rightParams,titleParams;
  24.  
  25. public Topbar(Context context, AttributeSet attrs) {
  26. super(context, attrs);
  27. //1 通过 context.obtainStyledAttributes 得到 TypedArray对象 并拿到属性值
  28. TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TopBar);
  29. leftText = ta.getString(R.styleable.TopBar_leftText);
  30. leftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
  31. leftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground);
  32.  
  33. rightText = ta.getString(R.styleable.TopBar_rightText);
  34. rightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
  35. rightBackground = ta.getDrawable(R.styleable.TopBar_rightBackground);
  36.  
  37. title = ta.getString(R.styleable.TopBar_title);
  38. titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, 0);
  39. titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize, 0);
  40. //记得回收下 防止出现一些内存问题
  41. ta.recycle();
  42.  
  43. // 2 new出控件
  44. leftButton = new Button(context);
  45. rightButton = new Button(context);
  46. tv_title = new TextView(context);
  47.  
  48. //3 把自定义的属性赋给控件
  49.  
  50. leftButton.setTextColor(leftTextColor);
  51. leftButton.setBackground(leftBackground);
  52. leftButton.setText(leftText);
  53.  
  54. rightButton.setTextColor(rightTextColor);
  55. rightButton.setBackground(rightBackground);
  56. rightButton.setText(rightText);
  57.  
  58. tv_title.setTextColor(titleTextColor);
  59. tv_title.setTextSize(titleTextSize);
  60. tv_title.setText(title);
  61. tv_title.setGravity(Gravity.CENTER);
  62.  
  63. setBackgroundColor(0xFFF59563);
  64.  
  65. // 5 new出LayoutParams 设置宽高
  66. leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
  67. // 6 设置规则 可以看出LayoutParams布局参数就是把你的控件以什么样的方式显示在组合控件
  68. leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
  69. //7 添加到布局中(控件,布局参数)
  70. addView(leftButton ,leftParams);
  71. rightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
  72. rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
  73. addView(rightButton, rightParams);
  74. titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.MATCH_PARENT);
  75. titleParams.addRule(RelativeLayout.CENTER_IN_PARENT);
  76. addView(tv_title,titleParams);
  77.  
  78. //8 TopBar的静态部分已经完毕了 到这一步就很明白了 我们采用的组合方式,用系统以及有的控件组合在一起,组成一个新的控件,这个思路是否可以延伸到其他地方呢?思考下
  79.  
  80. }
  81.  
  82. }

步骤三: 再Activity_main.xml中设置我们的自定义Topbar  重点我用红色和黄色标出,系统 xmlns(xml name space)的是:android 那么我们自己定义当然要有个个性的名字 我就写ace了, 再看后面res-auto ,这部分是控件属性资源地址.用AS的小伙伴

用res-auto就可以了 eslipse的小伙伴要写完整的地址 xmlns:XXXXXX="http://schemas.android.com/apk/res/包路径"

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:ace="http://schemas.android.com/apk/res-auto"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:fitsSystemWindows="true"
  7. tools:context="zb.com.topbardemo.MainActivity">
  8.  
  9. <zb.com.topbardemo.Topbar
  10. android:id="@+id/topbar"
  11. android:layout_width="wrap_content"
  12. android:layout_height="40dp"
  13. ace:leftTextColor = "#FFFFFF"
  14. ace:leftText ="后退"
  15. ace:leftBackground = "#4e32b4"
  16. ace:rightTextColor = "#FFFFFF"
  17. ace:rightText ="设置"
  18. ace:rightBackground = "#4e32b4"
  19. ace:title = "我是ACE"
  20. ace:titleTextColor = "#e20f0f"
  21. ace:titleTextSize = "15sp"
  22. >
  23.  
  24. </zb.com.topbardemo.Topbar>
  25.  
  26. </RelativeLayout>

静态部分完成现在写Topbar的点击事件 在Topbar类里写 :

  1. leftButton.setOnClickListener(new OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. Toast.makeText(context,"Ace Left",Toast.LENGTH_LONG).show();
  5. }
  6. });
  7.  
  8. rightButton.setOnClickListener(new OnClickListener() {
  9. @Override
  10. public void onClick(View v) {
  11. Toast.makeText(context,"Ace Right",Toast.LENGTH_LONG).show();
  12. }
  13. });

这样是可以 但是却把按钮的点击事件写死了,我们要根据不同情况调用不同的点击事件就无法实现

.要解决这个问题那么要用到接口回调,系统也是如此来做得.         OnclickListener是一个接口 那么我们也新建一个接口topbarClickListener,添加两个方法(左Button的点击和右Button的点击)

  1. package zb.com.topbardemo;
  2.  
  3. import android.content.Context;
  4. import android.content.res.TypedArray;
  5. import android.graphics.drawable.Drawable;
  6. import android.util.AttributeSet;
  7. import android.view.Gravity;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10. import android.widget.Button;
  11. import android.widget.RelativeLayout;
  12. import android.widget.TextView;
  13. import android.widget.Toast;
  14.  
  15. /**
  16. * Created by Ace on 2016/2/3.
  17. */
  18.  
  19.   //定义一个topbarClickListener
  20. private topbarClickListener mListner;
  21.  
  22. //定义一个接口 两个方法
  23. public interface topbarClickListener{
  24. public void leftClick();
  25. public void rightClick();
  26. }
  27. //暴露一个方法用来设置点击事件 并映射用户传进来的listner
  28. public void setTopbarClickListner(topbarClickListener listner){
  29. mListner = listner;
  30. }
  31. .
  32. .
  33. .
  34. .
  35. .
  36. .中间的代码省略跟前面一样不用变动
  37. .
  38. .
  39. .
  40. .
  41. . leftButton.setOnClickListener(new OnClickListener() {
  42. @Override
  43. public void onClick(View v) {
  44. mListner.leftClick();
  45. }
  46. });
  47.  
  48. rightButton.setOnClickListener(new OnClickListener() {
  49. @Override
  50. public void onClick(View v) {
  51. mListner.rightClick();
  52. }
  53. });
  54.  
  55. }
  56.  
  57. }

这样 按钮的点击按钮要做什么完全取决于用户来设置

 

我们用我们自己的方法来设置点击事件

MainActivity:

  1. public class MainActivity extends AppCompatActivity {
  2.  
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. Topbar topbar =(Topbar)findViewById(R.id.topbar);
  8. topbar.setTopbarClickListner(new Topbar.topbarClickListener() {
  9. @Override
  10. public void leftClick() {
  11. Toast.makeText(MainActivity.this,"Ace left",Toast.LENGTH_LONG).show();
  12. }
  13.  
  14. @Override
  15. public void rightClick() {
  16. Toast.makeText(MainActivity.this,"Ace right",Toast.LENGTH_LONG).show();
  17.  
  18. }
  19. });
  20.  
  21. }
  22.  
  23. }

我的AS出了点问题 暂时没有截图 抱歉~~~

  1.  

安卓界面篇(一) 自定义一个topbar的更多相关文章

  1. 自定义一个ListView实现聊天界面

    摘要 ListView可以称得上Android中最常用也最难用的控件了,几乎所有的应用程序都会用到它.由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示 ...

  2. iOS开发UI篇—Quartz2D(自定义UIImageView控件)

    iOS开发UI篇—Quartz2D(自定义UIImageView控件) 一.实现思路 Quartz2D最大的用途在于自定义View(自定义UI控件),当系统的View不能满足我们使用需求的时候,自定义 ...

  3. [安卓基础] 006.打开另一个Activity

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  4. 用仿ActionScript的语法来编写html5——第七篇,自定义按钮

    第七篇,自定义按钮这次弄个简单点的,自定义按钮.其实,有了前面所定义的LSprite,LBitmap等类,定义按钮就很方便了.下面是添加按钮的代码, function gameInit(event){ ...

  5. ExtJs5_继承自定义一个控件

    Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...

  6. 6、手把手教你Extjs5(六)继承自定义一个控件

    Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...

  7. CodeBlocks: 生成的exe文件自定义一个图标

    CodeBlocks生成的exe文件的图标默认是系统图标,如何自定义一个漂亮的小图标呢? 我是C菜鸟,平时只用CodeBlocks练习c,也不开发什么软件,这个问题就难倒我了. 到网上搜索了一下,发现 ...

  8. 自定义一个可以被序列化的泛型Dictionary<TKey,TValue>集合

    Dictionary是一个键值类型的集合.它有点像数组,但Dictionary的键可以是任何类型,内部使用Hash Table存储键和值.本篇自定义一个类型安全的泛型Dictionary<TKe ...

  9. 在Dynamics CRM中自定义一个通用的查看编辑注释页面

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复162或者20151016可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 注释在CRM中的显示是比较特别, ...

随机推荐

  1. ReSharper 卸载后 VS2012 没有提示问题

    虽然ReSharper非常强大,但由于公司电脑配置太差,被迫卸载了.但发现卸载后,VS2012自带的提示都没有了. 网上找了下相关的解决方法.摘抄下来,作为自己笔记. 解决方法原文出处:http:// ...

  2. [PL/SQL工具]绿色版PLSQL工具登录时提示初始化失败,无法锁定OCI.dll错误

    问题现象:使用绿色版PL/SQL工具进行登录时报如下截图错误: 问题描述:初始化失败,无法锁定oci.dll 解决方法:在PLSQL的菜单栏里依次选择 工具->首选项,在OCI库(自动检测为空) ...

  3. OOD沉思录 --- 类和对象的关系 --- 包含关系4

    4.9 在实现语义约束时,最好根据类定义来实现.但是这经常会导致泛滥成灾的类,在这种情况下约束应当在类的行为中实现,通常在类的构造函数中实现,但不是必须如此. 还是以汽车为例,我们看汽车的定义,为了集 ...

  4. 【体系结构】Oracle参数介绍

    [体系结构]Oracle参数介绍 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩ ...

  5. C++基础——子类转父类转子类 (派生类转基类转派生类)

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  6. java微信接口之四—上传素材

    一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=A ...

  7. 烂泥:LVM学习之LVM基础

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 有关LVM的好处我就不在此多介绍了,有空的话自己可以去百度百科中看看.我们在此之进行LVM的相关操作,以及命令的学习. 要想使系统支持LVM,我们必须安 ...

  8. Example to use django queryset

    from django.db.models import get_app, get_models, get_model from django.db import models #get the ce ...

  9. [转]Asp.NET MVC Widget开发 - ViewEngine

    本文转自:http://www.cnblogs.com/hsinlu/archive/2011/03/02/1968796.html 在Asp.NET开发博客类系统,我们经常都会用到Widget,像在 ...

  10. testng环境设置

    1.在eclipse中安装testng插件,地址:http://beust.com/eclipse 2.设置testng环境变量 testng_home D:\Program Files\eclips ...