Android学习(十七)自定义View控件 TopBar

一、创建自定义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中的用户控件!

时间: 2024-11-25 17:42:52

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

Android 自定义View控件

一.简介 在自定义View时,我们通常会重写onDraw()方法来绘制View的显示内容.如果,该View还需要使用wrap_content属性,那么还必须重写onMeasure()方法.另外,通过自定义attrs属性,还可以设置新的属性配置值. 在View中通常有以下一些比较重要的回调方法: onFinisInflate():从XML加载组件后回调: onSizeChanged():组件大小改变时回调: onMeasure():回调该方法来进行测量: onLayout():回调该方法来确定显示

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

自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需求,定义一些API方法: ----------------------------------4.根据需要,自定义控件的属性,可以参照TextView属性: 5.自定义命名空间,例如: xmlns:itheima="http://schemas.android.com/apk/res/<包名&

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

前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本. 使用自定义组合控件的好处? 我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的. 1.)第一种方式:直接在每个xml布局中写相同的标题栏布局代码 <?xm

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

设置中心 新建SettingActivity 设置GridView条目的点击事件 调用GridView对象的setOnItemClickListenner()方法,参数:OnItemClickListenner对象 匿名内部类实现,重写onItemClick()方法,传递进来的参数: parent是GridView对象,view是当前View对象,position是当前索引 switch判断,当时设置中心的索引时,跳转到设置中心 设置中心界面 使用相对布局,右边的<CheckBox/> 位于父

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

由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. 自定义组合控件 1.将已经编写好的布局文件,抽取到一个类中去做管理,下次还需要使用此布局结构的时候,直接使用组合控件对应的对象. 2.将组合控件的布局,抽取到单独的一个xml中 新建布局文件:setting_item_view.xml,将上篇文章中布局文件中的代码放进去 <?xml version=

Android打造万能自定义阴影控件

目录介绍 01.阴影效果有哪些实现方式 02.实现阴影效果Api 03.设置阴影需要注意哪些 04.常见Shape实现阴影效果 05.自定义阴影效果控件 06.如何使用该阴影控件 07.在recyclerView中使用注意点 01.阴影效果有哪些实现方式 阴影效果有哪些实现方式 第一种:使用CardView,但是不能设置阴影颜色 第二种:采用shape叠加,存在后期UI效果不便优化 第三种:UI切图 第四种:自定义View 否定上面前两种方案原因分析? 第一个方案的CardView渐变色和阴影效

自定义View控件(2—手写实例代码)

1. 步骤: + 1.自定义一个类继承于UIView + 2.在initWithFrame方法中添加子控件 + 3.在layoutSubviews中设置子控件的位置 + 4.提供一个属性保存外界传入的数据(模型对象), 重写setter方法设置子控件的数据 - 类工厂方法(便利构造器) + 按照苹果的风格和规范, 一般情况一个用于创建对象的对象方法会对应一个类方法 + 可以通过类工厂方法, 快速的根据数据创建一个对象 - 注意点: + 返回值一定要使用instancetype, 不要使用id +

自定义View控件(1—xib实例代码)

/** * 1. 设置显示到控制器上的模型数据(根据plist文件设置其属性,然后定义与实现工厂方法来快速实现字典转模型) */   // 1. 模型Shop.h文件 @interface Shop : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSString *icon; - (Shop *)initWithDict:(NSDictionary *)dict; +

自定义View控件(手写,xib)须知

 1. 目的 :提高代码的复用性,屏蔽内部的实现细节 2. 步骤 :    * 1> 自定义一个类继承于UIView   * 2> 在initWithFrame方法中添加子控件   * 3> 在layoutSubviews中设置子控件的位置   * 4> 提供一个属性保存外界传入的数据(模型对象), 重写setter方法设置子控件的数据 3. 类工厂方法(便利构造器):   * 按照苹果的风格和规范, 一般情况一个用于创建对象的对象方法会对应一个类方法   * 可以通过类工厂方法,