博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义控件系列之应用篇——自定义标题栏控件
阅读量:5914 次
发布时间:2019-06-19

本文共 7281 字,大约阅读时间需要 24 分钟。

一、问题概述

  通过之前的应用练习其实我们已经对自定义控件有了一定的掌握(查看自定义控件系列其余文章:、),但还是要不断做一些应用锻炼思维和熟练度,接下来我们再运用自定义控件编写一个新闻列表的标题栏,该标题栏控件有三种样式,效果如图所示:

  样式1:

 

  样式2:

 

  样式3:

 

  并且标题文字、左右图标可自由变换。实现步骤如下:

二、实现步骤

1、编写自定义组件HeaderView扩展LinearLayout

public class HeaderView extends LinearLayout {private LayoutInflater mInflater;    private View mHeader;    private LinearLayout mLayoutLeftContainer;//HeaderView控件左侧容器    private LinearLayout mLayoutRightContainer;//HeaderView控件右侧容器    private TextView mTitle;//标题    private LinearLayout mLayoutRightImageButtonLayout;//右侧按钮布局    private ImageButton mRightImageButton;//右侧按钮//右侧按钮监听接口    private onRightImageButtonClickListener mRightImageButtonClickListener;//左侧按钮布局    private LinearLayout mLayoutLeftImageButtonLayout;//左侧按钮    private ImageButton mLeftImageButton;//左侧按钮监听接口    private onLeftImageButtonClickListener mLeftImageButtonClickListener;    public enum HeaderStyle {
// 头部整体样式 DEFAULT_TITLE,TITLE_LIFT_IMAGEBUTTON,TITLE_RIGHT_IMAGEBUTTON, TITLE_DOUBLE_IMAGEBUTTON; } public HeaderLayout(Context context) { super(context); init(context); } public HeaderLayout(Context context, AttributeSet attrs) { super(context, attrs); init(context); }//实现初始化,加载布局文件 public void init(Context context) { mInflater = LayoutInflater.from(context); mHeader = mInflater.inflate(R.layout.common_headerbar, null); addView(mHeader); initViews(); }//初始化控件public void initViews(){mLayoutLeftContainer = (LinearLayout) findViewByHeaderId(R.id.header_layout_leftview_container);mLayoutRightContainer=(LinearLayout)findViewByHeaderId(R.id.header_layout_rightview_container);mHtvSubTitle = (TextView) findViewByHeaderId(R.id.header_htv_subtitle); }public View findViewByHeaderId(int id) { return mHeader.findViewById(id); } //设置控件样式public void initStyle(HeaderStyle hStyle) { switch (hStyle) { case DEFAULT_TITLE: defaultTitle(); break; case TITLE_LIFT_IMAGEBUTTON: defaultTitle(); titleLeftImageButton(); break; case TITLE_RIGHT_IMAGEBUTTON: defaultTitle(); titleRightImageButton(); break; case TITLE_DOUBLE_IMAGEBUTTON: defaultTitle(); titleLeftImageButton(); titleRightImageButton(); break; } } // 默认文字标题 private void defaultTitle() { mLayoutLeftContainer.removeAllViews(); mLayoutRightContainer.removeAllViews(); } // 左侧自定义按钮 private void titleLeftImageButton() { View mleftImageButtonView= mInflater.inflate(R.layout.include_header_imagebutton, null);mLayoutLeftContainer.addView(mleftImageButtonView);mLayoutLeftImageButtonLayout =(LinearLayout)mleftImageButtonView.findViewById(R.id.header_layout_imagebuttonlayout);mLeftImageButton =(ImageButton)mleftImageButtonView.findViewById(R.id.header_ib_imagebutton);mLayoutLeftImageButtonLayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if (mLeftImageButtonClickListener != null) { //回调方法,调用onLeftImageButtonClickListener接口实现类的方法 mLeftImageButtonClickListener.onClick(); } } });} // 右侧自定义按钮private void titleRightImageButton() {View mRightImageButtonView = mInflater.inflate(R.layout.include_header_imagebutton, null);mLayoutRightContainer.addView(mRightImageButtonView);mLayoutRightImageButtonLayout = (LinearLayout)mRightImageButtonView.findViewById(R.id.header_layout_imagebuttonlayout); mRightImageButton = (ImageButton)mRightImageButtonView.findViewById(R.id.header_ib_imagebutton);mLayoutRightImageButtonLayout.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View arg0) { if (mRightImageButtonClickListener != null) {//回调方法,调用onRightImageButtonClickListener接口实现类的方法 mRightImageButtonClickListener.onClick(); }} }); } public void setDefaultTitle(CharSequence title) { if (title != null) { mHtvSubTitle.setText(title); } else { mHtvSubTitle.setVisibility(View.GONE); } }//重要目的是设置右侧按钮侦听接的实现类,还包括了标题文本、按钮图片 public void setTitleAndRightImageButton(CharSequence title, int id, onRightImageButtonClickListener onRightImageButtonClickListener) { setDefaultTitle(title); if (mRightImageButton != null && id > 0) { mRightImageButton.setImageResource(id); setOnRightImageButtonClickListener(onRightImageButtonClickListener); } }//重要目的是左侧按钮设置侦听接的实现类还包,括了标题文本、按钮图片 public void setTitleAndLeftImageButton(CharSequence title, int id, onLeftImageButtonClickListener listener) { setDefaultTitle(title); if (mLeftImageButton != null && id > 0) { mLeftImageButton.setImageResource(id); setOnLeftImageButtonClickListener(listener); } } public void setOnRightImageButtonClickListener( onRightImageButtonClickListener listener) { mRightImageButtonClickListener = listener; } //设置右侧按钮监听接口 public interface onRightImageButtonClickListener { void onClick(); } public void setOnLeftImageButtonClickListener( onLeftImageButtonClickListener listener) { mLeftImageButtonClickListener = listener; } //设置左侧按钮监听接口 public interface onLeftImageButtonClickListener { void onClick(); }}

2、HeaderView控件布局文件 

3、include_head_imagebutton.xml,左右按钮的布局文件

   通过 LayoutInflater的inflate方法,如:View  mRightImageButtonView =mInflater.inflate(R.layout.include_header_imagebutton, null)获得布局

4、编写MainActivity测试自定义组件

public class MainActivity extends Activity  {    private HeaderView  mHeaderView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initViews();    }    protected void initViews(){        mHeaderView = (HeaderView )findViewById(R.id.otherfeedlist_header);        mHeaderView.initStyle(HeaderStyle.TITLE_DOUBLE_IMAGEBUTTON);//设置左侧按钮,参数依次为标题文本、图片、左侧按钮侦听类mHeaderView.setTitleAndLeftImageButton("新闻头条", R.drawable.comm_new_home_index_user_normal, leftButtonClickListener);//设置右侧按钮,参数依次为标题文本、图片、右侧按钮侦听类        mHeaderView.setTitleAndRightImageButton("新闻头条", R.drawable.comm_new_home_index_home_normal, rightButtonClickListener);}//实现HeadView组件的左侧按钮侦听接口private onLeftImageButtonClickListener leftButtonClickListener=new onLeftImageButtonClickListener() {                public void onClick() {            Toast.makeText(getApplicationContext(), "您点击了左侧按钮!", Toast.LENGTH_SHORT).show();        }    };//实现HeadView组件的右侧右侧侦听接口    private onRightImageButtonClickListener rightButtonClickListener=new onRightImageButtonClickListener() {        public void onClick() {            Toast.makeText(getApplicationContext(), "您点击了右侧按钮!", Toast.LENGTH_SHORT).show();        }    };}

5、MainActivity布局文件

 

作者:
出处:
 
本文版权归和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 

转载于:https://www.cnblogs.com/jerehedu/p/4401962.html

你可能感兴趣的文章
WarriorJS —— JS别样学习之路
查看>>
Linux下实现 OpenSSL 简单加密与解密字符串
查看>>
获取文件资源的各种方式
查看>>
顺序堆栈的实现
查看>>
Struts2.x+FileUpload实现单文件上传
查看>>
Spring的事务管理难点剖析(2):应用分层的迷惑
查看>>
android源代码下载——android环境配置
查看>>
发现大量的TIME_WAIT解决办法
查看>>
快速排序算法
查看>>
mysql 替换函数replace()实现mysql 替换字符串
查看>>
SQLite3性能优化1-多线程插入或者查询操作方面
查看>>
POI处理excel2007内存溢出问题
查看>>
Java笔试题(互联网金融方向)
查看>>
连接数据库的错误
查看>>
spring mvc 单例模式
查看>>
阿里云服务器内部dns可能出错
查看>>
生成HTML静态网店系统的优势
查看>>
ubuntu Nodejs和npm的安装
查看>>
Tomcat session共享 —MSM
查看>>
每日一模式之迭代器模式
查看>>