安卓界面篇(一) 自定义一个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中的显示是比较特别, ...
随机推荐
- ReSharper 卸载后 VS2012 没有提示问题
虽然ReSharper非常强大,但由于公司电脑配置太差,被迫卸载了.但发现卸载后,VS2012自带的提示都没有了. 网上找了下相关的解决方法.摘抄下来,作为自己笔记. 解决方法原文出处:http:// ...
- [PL/SQL工具]绿色版PLSQL工具登录时提示初始化失败,无法锁定OCI.dll错误
问题现象:使用绿色版PL/SQL工具进行登录时报如下截图错误: 问题描述:初始化失败,无法锁定oci.dll 解决方法:在PLSQL的菜单栏里依次选择 工具->首选项,在OCI库(自动检测为空) ...
- OOD沉思录 --- 类和对象的关系 --- 包含关系4
4.9 在实现语义约束时,最好根据类定义来实现.但是这经常会导致泛滥成灾的类,在这种情况下约束应当在类的行为中实现,通常在类的构造函数中实现,但不是必须如此. 还是以汽车为例,我们看汽车的定义,为了集 ...
- 【体系结构】Oracle参数介绍
[体系结构]Oracle参数介绍 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩ ...
- C++基础——子类转父类转子类 (派生类转基类转派生类)
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- java微信接口之四—上传素材
一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=A ...
- 烂泥:LVM学习之LVM基础
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 有关LVM的好处我就不在此多介绍了,有空的话自己可以去百度百科中看看.我们在此之进行LVM的相关操作,以及命令的学习. 要想使系统支持LVM,我们必须安 ...
- Example to use django queryset
from django.db.models import get_app, get_models, get_model from django.db import models #get the ce ...
- [转]Asp.NET MVC Widget开发 - ViewEngine
本文转自:http://www.cnblogs.com/hsinlu/archive/2011/03/02/1968796.html 在Asp.NET开发博客类系统,我们经常都会用到Widget,像在 ...
- testng环境设置
1.在eclipse中安装testng插件,地址:http://beust.com/eclipse 2.设置testng环境变量 testng_home D:\Program Files\eclips ...