安卓界面篇(一) 自定义一个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中的显示是比较特别, ...
随机推荐
- eclipse 中手动安装 subversive SVN
为什么我选择手动安装呢?因为通过 eclipse market 下载实在太慢了. 1.下载离线安装包 http://www.eclipse.org/subversive/latest-releas ...
- 大家一起和snailren学java-(三) 操作符&控制执行流程
“又是新的一周,感觉要学的东西还有好多,加油.由于第三章和第四章内容要总结的不是很多,没太多需要拿出来说的,就整合到一个帖子好了” 操作符 操组符,什么是操作符?其实就是+-*/=&^~| 等 ...
- Erlang 的新数据结构 map 浅析
更新:文中示例代码直接从Joe的新版 Erlang 书中摘抄而来,其中模式匹配的代码有错误,现已纠正.应该用 := 匹配字段,而不是 => . 即将发布的 Erlang 17 最大变化之一包括新 ...
- .net 中使用配置文件需注意引用dll文件
需要用到sqlhelper和配置文件时发现加了using System.Configuration;还是不能用ConfigurationManager. 查了几遍msdn未果,直接百度才发现还需要引用 ...
- C# 图片处理(压缩、剪裁,转换,优化)
1.图片与二进制的转换 图片转换成二进制主要用于数据库存储及图片数据的应用间传输,如网站服务器通过WebService或WCF从数据处理服务器获取图片数据,就可以以二进制形式传输 ///图片转二进制 ...
- JS中的event 对象详解
JS中的event 对象详解 JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...
- 烂泥:LVM学习之KVM利用LVM快照备份与恢复虚拟机
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近一段时间一直在学习有关LVM逻辑卷方面的知识,前几篇文章介绍了有关LVM的逻辑卷的基本相关知识,包括逻辑卷及卷组的扩容与缩小.今天我们再来介绍LVM ...
- HTTP Session原理
深入理解HTTP Session session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的 ...
- calc 多项式计算 (STL版和非STL版) -SilverN
计算(calc.cpp) [问题描述] 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*” ...
- div中的内容垂直居中的五种方法
一.行高(line-height)法 如果要垂直居中的只有一行或几个文字,那它的制作最为简单,只要让文字的行高和容器的高度相同即可,比如: p { height:30px; line-height:3 ...