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

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TopBar" >
<attr name="title" format="string"/>
<attr name="titleTextSize" format="dimension"/>
<attr name="titleTextColor" format="color"/>
<attr name="leftText" format="string"/>
<attr name="leftBackground" format="reference|color"/>
<attr name="leftTextColor" format="color"/>
<attr name="rightText" format="string"/>
<attr name="rightBackground" format="reference|color"/>
<attr name="rightTextColor" format="color"/> </declare-styleable> </resources>

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

/**
* Created by Ace on 2016/2/3.
*/
public class Topbar extends RelativeLayout { //声明我们需要的控件
private Button leftButton,rightButton;
private TextView tv_title; private int leftTextColor;
private String leftText;
private Drawable leftBackground; private int rightTextColor;
private String rightText;
private Drawable rightBackground; private String title;
private int titleTextColor;
private float titleTextSize; //4 定义布局属性
private LayoutParams leftParams , rightParams,titleParams; public Topbar(Context context, AttributeSet attrs) {
super(context, attrs);
//1 通过 context.obtainStyledAttributes 得到 TypedArray对象 并拿到属性值
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TopBar);
leftText = ta.getString(R.styleable.TopBar_leftText);
leftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
leftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground); rightText = ta.getString(R.styleable.TopBar_rightText);
rightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
rightBackground = ta.getDrawable(R.styleable.TopBar_rightBackground); title = ta.getString(R.styleable.TopBar_title);
titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, 0);
titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize, 0);
//记得回收下 防止出现一些内存问题
ta.recycle(); // 2 new出控件
leftButton = new Button(context);
rightButton = new Button(context);
tv_title = new TextView(context); //3 把自定义的属性赋给控件 leftButton.setTextColor(leftTextColor);
leftButton.setBackground(leftBackground);
leftButton.setText(leftText); rightButton.setTextColor(rightTextColor);
rightButton.setBackground(rightBackground);
rightButton.setText(rightText); tv_title.setTextColor(titleTextColor);
tv_title.setTextSize(titleTextSize);
tv_title.setText(title);
tv_title.setGravity(Gravity.CENTER); setBackgroundColor(0xFFF59563); // 5 new出LayoutParams 设置宽高
leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
// 6 设置规则 可以看出LayoutParams布局参数就是把你的控件以什么样的方式显示在组合控件
leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
//7 添加到布局中(控件,布局参数)
addView(leftButton ,leftParams);
rightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
addView(rightButton, rightParams);
titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.MATCH_PARENT);
titleParams.addRule(RelativeLayout.CENTER_IN_PARENT);
addView(tv_title,titleParams); //8 TopBar的静态部分已经完毕了 到这一步就很明白了 我们采用的组合方式,用系统以及有的控件组合在一起,组成一个新的控件,这个思路是否可以延伸到其他地方呢?思考下 } }

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

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ace="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="zb.com.topbardemo.MainActivity"> <zb.com.topbardemo.Topbar
android:id="@+id/topbar"
android:layout_width="wrap_content"
android:layout_height="40dp"
ace:leftTextColor = "#FFFFFF"
ace:leftText ="后退"
ace:leftBackground = "#4e32b4"
ace:rightTextColor = "#FFFFFF"
ace:rightText ="设置"
ace:rightBackground = "#4e32b4"
ace:title = "我是ACE"
ace:titleTextColor = "#e20f0f"
ace:titleTextSize = "15sp"
> </zb.com.topbardemo.Topbar> </RelativeLayout>

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

        leftButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"Ace Left",Toast.LENGTH_LONG).show();
}
}); rightButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"Ace Right",Toast.LENGTH_LONG).show();
}
});

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

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

package zb.com.topbardemo;

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.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast; /**
* Created by Ace on 2016/2/3.
*/   //定义一个topbarClickListener
private topbarClickListener mListner; //定义一个接口 两个方法
public interface topbarClickListener{
public void leftClick();
public void rightClick();
}
//暴露一个方法用来设置点击事件 并映射用户传进来的listner
public void setTopbarClickListner(topbarClickListener listner){
mListner = listner;
}
.
.
.
.
.
.中间的代码省略跟前面一样不用变动
.
.
.
.
. leftButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mListner.leftClick();
}
}); rightButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mListner.rightClick();
}
}); } }

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

 

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

MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Topbar topbar =(Topbar)findViewById(R.id.topbar);
topbar.setTopbarClickListner(new Topbar.topbarClickListener() {
@Override
public void leftClick() {
Toast.makeText(MainActivity.this,"Ace left",Toast.LENGTH_LONG).show();
} @Override
public void rightClick() {
Toast.makeText(MainActivity.this,"Ace right",Toast.LENGTH_LONG).show(); }
}); } }

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

												

安卓界面篇(一) 自定义一个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. iOS-RegexKitLite导入错误

    RegexKitLite是什么? RegexKitLite是一个非常方便的处理正则表达式的第三方类库. 本身只有一个RegexKitLite.h和RegexKitLite.m 导入RegexKitLi ...

  2. OC语言-08-深拷贝与浅拷贝详解(示例)

    概述 拷贝:复制一个与源对象内容相同的对象 实现拷贝,需要遵守以下两个协议 NSCopying NSMutableCopying 拷贝返回对象的种类 可变,mutableCopy消息返回的对象 不可变 ...

  3. iOS网络-02-数据解析(JSON与XML)

    数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...

  4. Java眼中的XML--文件读取--1 应用DOM方式解析XML

    初次邂逅XML: 需要解析的XML文件: 这里有两个book子节点. 1.如何进行XML文件解析前的准备工作,另外解析先获取book节点. 这个我后来看懂了: 这个Node的ELEMENT_NODE= ...

  5. tp_link路由器 重新设置

    当打不开网站,而提示让我们登录电信猫时,通常是由于突然断电导致的路由器程序错误.重新路由器设置即可.     1.路由器恢复出厂设置       2.用网线分别连接电脑和路由器的LAN口.(也就是将 ...

  6. android network develop(1)----doing network background

    Develop network with HttpURLConnection & HttpClient. HttpURLConnection  is lightweight with Http ...

  7. Effective Java 27 Favor generic methods

    Static utility methods are particularly good candidates for generification. The type parameter list, ...

  8. session失效后跳转到登陆页面

    一.编写Filter拦截器类 package com.pv.utils; import java.io.IOException; import java.io.PrintWriter; import ...

  9. IE11的API变化

    IE11已经登录Win8.1,它的API有了很大变更 一.User-agent字符串的更改 IE10的是 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT ...

  10. textarea文本简单样式编辑

    第一种方法采用替换:就是将文本域的换号符号\r\n,替换成其他符号,存入数据库,然后显示的时候再转换回来: //转换换行符$str=preg_replace("/\r\n|\r|\n/&qu ...