一、创建自定义TopBar头部菜单条

  实现步骤:

  1、在values中添加attrs.xml文件,设置自定义属性。

  2、添加Topbar类,继承RelativeLayout,实现具体功能。

  3、添加到页面上,并设置添加事件。

参考代码:

  values\attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Topbar">
<attr name="toptitle" format="string" /> <!--中间文字,类型字符串-->
<attr name="titleTextSize" format="dimension" /> <!--字体大小,类型为数字-->
<attr name="titleTextColor" format="color"/> <!--字体颜色,类型为颜色-->
<attr name="leftTextColor" format="color"/> <!--左侧字体颜色,类型为颜色-->
<attr name="leftBackground" format="reference|color" /> <!--左侧背景颜色,类型为图片和颜色-->
<attr name="leftText" format="string" /> <!--左侧文字-->
<attr name="rightTextColor" format="color"/> <!--右侧文字颜色-->
<attr name="rightBackground" format="reference|color" /> <!--右侧背景-->
<attr name="rightText" format="string" /> <!--右侧文字-->
</declare-styleable>
</resources>

  TopBar.java,自定义View实现类。

package com.example.zhengcheng.myapplication;

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.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView; /**
* Created by zhengcheng on 2015/4/11.
*/
public class TopBar extends RelativeLayout {
private Button btn_left, btn_right;
private TextView tv_title; private int leftTextColor;
private Drawable leftBackground;
private String leftText; private int rightTextColor;
private Drawable rightBackground;
private String rightText; private float titleTextSize;
private int titleTextColor;
private String toptitle; //定义三个布局参数
private LayoutParams leftParams, rightParams, titleParams; //定义一个事件接口
public interface topbarClickListener{
public void leftClick();
public void rightClick();
} //创建接口对象
public topbarClickListener listener; //创建为事件接口赋值的方法
public void setOnTopBarClickListener(topbarClickListener listener){
this.listener = listener;
} //构造方法,初始化成员
public TopBar(Context context, AttributeSet attrs) {
super(context, attrs); //将XML中定义的自定义属性映射到attrs中。
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.Topbar); //从ta结构中获取数据,类似一种key,value结构,通过R.styleable.Topbar_属性名获取
leftTextColor = ta.getColor(R.styleable.Topbar_leftTextColor, 0);
leftBackground = ta.getDrawable(R.styleable.Topbar_leftBackground);
leftText = ta.getString(R.styleable.Topbar_leftText); rightTextColor = ta.getColor(R.styleable.Topbar_rightTextColor, 0);
rightBackground = ta.getDrawable(R.styleable.Topbar_rightBackground);
rightText = ta.getString(R.styleable.Topbar_rightText); titleTextSize = ta.getDimension(R.styleable.Topbar_titleTextSize, 0);
titleTextColor = ta.getColor(R.styleable.Topbar_titleTextColor, 0);
toptitle = ta.getString(R.styleable.Topbar_toptitle); //进行垃圾回收
ta.recycle(); //初始化控件
btn_left = new Button(context);
btn_right = new Button(context);
tv_title = new TextView(context); //设置控件的值
btn_left.setTextColor(leftTextColor); //设置文字颜色
btn_left.setBackground(leftBackground); //设置背景
btn_left.setText(leftText); //设置文本 btn_right.setTextColor(rightTextColor); //设置文字颜色
btn_right.setBackground(rightBackground); //设置背景
btn_right.setText(rightText); //设置文本 tv_title.setTextColor(titleTextColor); //设置字体颜色
tv_title.setTextSize(titleTextSize); //设置字体大小
tv_title.setText(toptitle); //设置文本
tv_title.setGravity(Gravity.CENTER); //居中显示 setBackgroundColor(0xfff59563); //设置View的背景颜色 //设置布局属性的width和height
leftParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
//设置对齐方式为父容器的左侧
leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);
//将左边按钮添加到视图中,并设置布局属性
addView(btn_left, leftParams); //设置布局属性的width和height
rightParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
//设置对齐方式为父容器的右侧
rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);
//将右边按钮添加到视图中,并设置布局属性
addView(btn_right, rightParams); //设置布局属性的width和height
titleParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
//设置对齐方式为居中对齐
titleParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);
//将中间TextView添加到视图中,并设置布局属性
addView(tv_title, titleParams); //添加左侧按钮的Click事件
btn_left.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listener.leftClick();
}
}); //添加右侧按钮的Click事件
btn_right.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listener.rightClick();
}
});
} /**
* 设置左边按钮是否隐藏,true隐藏, false消失
* @param flag
*/
public void setLeftButtonIsVisiable(boolean flag){
if(flag){
btn_left.setVisibility(View.VISIBLE);
}else{
btn_left.setVisibility(View.GONE);
}
} /**
* 设置右边按钮是否隐藏,true隐藏, false消失
* @param flag
*/
public void setRightButtonIsVisiable(boolean flag){
if(flag){
btn_right.setVisibility(View.VISIBLE);
}else{
btn_right.setVisibility(View.GONE);
}
}
}

  main.xml,主页面文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"> <com.example.zhengcheng.myapplication.TopBar
android:id="@+id/MyTopbar"
android:layout_width="match_parent"
android:layout_height="40dp"
custom:leftTextColor="#FFFFFF"
custom:leftText="Back"
custom:leftBackground="#ffa4c161"
custom:rightTextColor="#FFFFFF"
custom:rightText="More"
custom:rightBackground="#ffa4c161"
custom:titleTextSize="8dp"
custom:titleTextColor="#000000"
custom:toptitle="自定义模版">
</com.example.zhengcheng.myapplication.TopBar>
</RelativeLayout>

  main.java 后台代码文件

package com.example.zhengcheng.myapplication;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast; public class MainActivity extends ActionBarActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); TopBar topbar = (TopBar) findViewById(R.id.MyTopbar); //设置左右按钮为隐藏
topbar.setLeftButtonIsVisiable(false);
topbar.setRightButtonIsVisiable(false); //添加topbar的事件
topbar.setOnTopBarClickListener(new TopBar.topbarClickListener() {
@Override
public void leftClick() {
Toast.makeText(MainActivity.this,"点击了左边的按钮",Toast.LENGTH_SHORT).show();
} @Override
public void rightClick() {
Toast.makeText(MainActivity.this,"点击了右边的按钮",Toast.LENGTH_SHORT).show();
}
});
}
}

  全部功能实现,可以使某个功能模块重复利用。大大提高代码的福永率,有点类似.net中的用户控件!

Android学习(十七)自定义View控件 TopBar的更多相关文章

  1. Android自定义控件之自定义组合控件

    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...

  2. Android开发学习笔记-自定义组合控件的过程

    自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需 ...

  3. android学习日记03--常用控件button/imagebutton

    常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...

  4. Android 手机卫士--自定义组合控件构件布局结构

    由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. ...

  5. Android开发之自定义组合控件

    自定义组合控件的步骤1.自定义一个View,继承ViewGroup,比如RelativeLayout2.编写组合控件的布局文件,在自定义的view中加载(使用View.inflate())3.自定义属 ...

  6. [android] 手机卫士自定义组合控件

    设置中心 新建SettingActivity 设置GridView条目的点击事件 调用GridView对象的setOnItemClickListenner()方法,参数:OnItemClickList ...

  7. Android自定义控件之自定义组合控件(三)

    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...

  8. Android开发学习笔记-自定义组合控件

    为了能让代码能够更多的复用,故使用组合控件.下面是我正在写的项目中用到的方法. 1.先写要组合的一些需要的控件,将其封装到一个布局xml布局文件中. <?xml version="1. ...

  9. Android自定义view控件

    转载自: http://blog.163.com/ppy2790@126/blog/static/103242241201382210910473/ 开发自定义控件的步骤: 1.了解View的工作原理 ...

随机推荐

  1. Oracle中DBMS_LOB包使用小结

    本文主要介绍oracle数据库中dbms_lob包的使用以及使用dbms_lob包来维护lob数据库类型的基本方法.随着社会的发展,在现代信息系统的开发中,需要存储的已不仅仅是简单的文字信息,同时还包 ...

  2. penGL入门学习(六)

    http://blog.csdn.net/sun6255028/article/details/5090067 今天要讲的是动画制作——可能是各位都很喜欢的.除了讲授知识外,我们还会让昨天那个“太阳. ...

  3. Mac下jdk多版本管理

    网上试了.bash_profile中增加路径设置别名的方法,但是始终无法切换,只能使用jenv了. 1. 下载 jenv(来自官网) git clone https://github.com/gcui ...

  4. java如何增加数组长度

    遇到一个面试题:在不使用list的add方法的情况下,动态的添加元素(大概是这个样子): ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,需学习arraylist的相关知识(ht ...

  5. java的unity单元测试

    import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestUnit { publ ...

  6. hdu 5142(数学-进制转换)

    NPY and FFT Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. cloudflare 301 重定向设置

    https://support.cloudflare.com/hc/en-us/articles/218411427#redirects 将 https://dfg.com/* 设置301重定向到 h ...

  8. JAVA SERVLET 属性范围样例

    package com.jeelearning.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; ...

  9. 使用iframe实现页面无刷新提交表单

    iframe提交表单其实比ajax要方便一些,当然ajax也有ajax的好处,只是ajax编码处理有时有些麻烦,虽然经过转码是可以解决中文问题,但如果直接使用iframe不存这些问题了,下面来看看. ...

  10. 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?

    牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...