安卓界面篇(一) 自定义一个topbar
步骤一: 先在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的更多相关文章
- 自定义一个ListView实现聊天界面
摘要 ListView可以称得上Android中最常用也最难用的控件了,几乎所有的应用程序都会用到它.由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示 ...
- iOS开发UI篇—Quartz2D(自定义UIImageView控件)
iOS开发UI篇—Quartz2D(自定义UIImageView控件) 一.实现思路 Quartz2D最大的用途在于自定义View(自定义UI控件),当系统的View不能满足我们使用需求的时候,自定义 ...
- [安卓基础] 006.打开另一个Activity
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 用仿ActionScript的语法来编写html5——第七篇,自定义按钮
第七篇,自定义按钮这次弄个简单点的,自定义按钮.其实,有了前面所定义的LSprite,LBitmap等类,定义按钮就很方便了.下面是添加按钮的代码, function gameInit(event){ ...
- ExtJs5_继承自定义一个控件
Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...
- 6、手把手教你Extjs5(六)继承自定义一个控件
Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...
- CodeBlocks: 生成的exe文件自定义一个图标
CodeBlocks生成的exe文件的图标默认是系统图标,如何自定义一个漂亮的小图标呢? 我是C菜鸟,平时只用CodeBlocks练习c,也不开发什么软件,这个问题就难倒我了. 到网上搜索了一下,发现 ...
- 自定义一个可以被序列化的泛型Dictionary<TKey,TValue>集合
Dictionary是一个键值类型的集合.它有点像数组,但Dictionary的键可以是任何类型,内部使用Hash Table存储键和值.本篇自定义一个类型安全的泛型Dictionary<TKe ...
- 在Dynamics CRM中自定义一个通用的查看编辑注释页面
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复162或者20151016可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 注释在CRM中的显示是比较特别, ...
随机推荐
- 《慕客网:IOS-动画入门》学习笔记
新建Cocoa Touch Class,语言是swift 然后继续为界面添加一个普通的View Controller,并且添加前面视图的静态table的转向剪头指向这个View Controller, ...
- javascript 的默认对象
一.日期对象 格式 : 日期对象名称=new Date([日期参数]) 日期参数: 1.省略(最常用) 2.英文-参数格式 ...
- CentOS下如何完全卸载MySQL?卸载自带的mysql
CentOS下如何完全卸载MySQL?解决卸载不干净的问题 系统:CentOS 6.5,MySQL:MySql 5.6 这里主要解决使用rpm安装的卸载问题,安装方法见:CentOS安装mysql*. ...
- apt-get报错could not get lock /var/lib/dpkg/lock -open等
用apt-get命令安装一些软件包时,总报错:E:could not get lock /var/lib/dpkg/lock -open等 出现这个问题的原因可能是有另外一个程序正在运行,导致资源被锁 ...
- PHP开发第一个扩展
首先声明:我们要构建的是扩展或者模块名为hello_module.该模块提供一个方法:hello_word. 一.PHP环境的搭建 1)一般使用源码包编译安装,而不是binary包安装.因为使用PHP ...
- Hbase快速开始——shell操作
一. 介绍 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...
- javascript之url转义escape()、encodeURI()和encodeURIComponent()
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...
- TCP/IP详解--TCP首部选项中时间戳选项
一.简介 TCP时间戳选项会在TCP包头增加12个字节,以一种比重发超时更精确的方法来启用对RTT 的计算. 二.作用 ) TCP时间戳位于TCP选项中,kind=:lenth=:data由tim ...
- mysql存储过程procedure
传送门 http://www.blogjava.net/sxyx2008/archive/2009/11/24/303497.html ) ); DROP PROCEDURE IF EXISTS ju ...
- Hive query issue
One time, I have written a query with two tables join, One table is big table with partitions , anot ...