• 自定义控件系列之应用篇——自定义标题栏控件


    一、问题概述

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

      样式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() {
                @Override
    public 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控件布局文件 

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="54dip"
        android:background="#ff0000"
        android:baselineAligned="false"
        android:focusable="true"
        android:gravity="center_vertical"
        android:orientation="horizontal" >
        <LinearLayout
            android:id="@+id/header_layout_leftview_container"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_alignParentLeft="true"
            android:gravity="center_vertical|left"
            android:orientation="horizontal" >
        </LinearLayout>
        <LinearLayout
            android:id="@+id/header_layout_middleview_container"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:gravity="center"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:orientation="horizontal" >
    
            <TextView
                android:id="@+id/header_htv_subtitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/app_name"
                android:textColor="#FCFCFC"
                android:textSize="22sp" />
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/header_layout_rightview_container"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_alignParentRight="true"
            android:gravity="center_vertical|right"
            android:orientation="horizontal" >
        </LinearLayout>
    
    </RelativeLayout>

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

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/header_layout_imagebuttonlayout"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:background="@drawable/bg_header_defaul"
        android:clickable="true"
        android:focusable="true"
        android:gravity="center"
        android:minWidth="54dip"
        android:padding="6dip" >
        <ImageButton
            android:id="@+id/header_ib_imagebutton"
            android:layout_width="35dip"
            android:layout_height="35dip"
            android:background="#00000000"
            android:clickable="false"
            android:focusable="false"
            android:contentDescription="@string/app_name"
            android:scaleType="centerInside" />
    </LinearLayout>

    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布局文件

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    <com.jereh.view.HeaderLayout
         android:id="@+id/otherfeedlist_header"
        android:layout_width="fill_parent"
        android:layout_height="54dip" >
    </com.jereh.view.HeaderLayout>
    </LinearLayout>
    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
     
  • 相关阅读:
    suging闲谈netty 的异步非阻塞IO线程与业务线程分离
    实战 | 关于随手一点就发现XSS漏洞这件事
    Java安全第一篇 | 反射看这一篇就够了
    工具推荐 | Xshell全版本解密工具(包括Xshell7)——SharpXDecrypt
    InfluxDB 2.x Open Source Time Series Database
    Grafana v8.3.3 & jmeterinfluxdb2backend
    【聊聊认知】你的问题是什么
    第5章着色基础5.4锯齿和抗锯齿
    第3章图形处理单元3.8像素着色器
    面向对象编程(C++篇2)——构造
  • 原文地址:https://www.cnblogs.com/jerehedu/p/4401962.html
Copyright © 2020-2023  润新知