先声明,一下用的kotlin写的,不是java,但是这两个是相通的,如果使用java的话类比就行
写这个主要是解决原生系统存在的一些问题,比如如果是系统原生的ActionBar的话:
1、getActionBar的时候要考虑到activity引用的主题theme,如果是NoActionBar之类的主题的话,会取不到ActionBar,报空指针
2、即使是theme选对了,也能取到ActionBar了,实际用的时候左右会有16dp的边距,这是系统在写theme的时候,左右设置了边距,虽然网上有一些是解决这个问题的,但是方法都是用的toolBar(需要在xml里添加控件),既然xml里要添加控件还不如自己自定义一个ActionBar,使用起来也灵活,还不用考虑theme的问题,下面来实现自己的自定义ActionBar
=====================================华丽的分割线=========================================
比如我们做一下如下效果
一、我们叫自定义的ActionBar为BaseActionBar
class BaseActionBar constructor(context: Context, attrs: AttributeSet? = null) : RelativeLayout(context, attrs) , View.OnClickListener{ var mListener : ActionBarTouchListener? = null init { val array = context.obtainStyledAttributes(attrs, R.styleable.BaseActionBar) var title = array.getString(R.styleable.BaseActionBar_title) var rightMsg = array.getString(R.styleable.BaseActionBar_rightMessage) var rightMsgIsShow = array.getBoolean(R.styleable.BaseActionBar_rightMessageIsShow, false) val view = LayoutInflater.from(context).inflate(R.layout.base_view_action_bar, null) view.findViewById<ImageView>(R.id.iv_left).setOnClickListener(this) view.findViewById<TextView>(R.id.tv_title).text = title var tvRight = view.findViewById<TextView>(R.id.tv_right) tvRight.setOnClickListener(this) tvRight.text = rightMsg tvRight.visibility = if(rightMsgIsShow) View.VISIBLE else View.INVISIBLE addView(view) } override fun onClick(v: View?) { if (mListener == null) return when(v!!.id){ R.id.iv_left -> mListener!!.onActionBarLeft() R.id.tv_right -> mListener!!.onActionBarRight() } } interface ActionBarTouchListener{ fun onActionBarLeft() fun onActionBarRight() } public fun setActionBarTouchListener(listener: ActionBarTouchListener){ mListener = listener } }
二、资源文件attrs(放在res/values/下,如果没有这个文件就新建一个)
<?xml version="1.0" encoding="utf-8"?> <resources> <!--标题栏--> <declare-styleable name="BaseActionBar"> <attr name="title" format="string"/>//中间标题 <attr name="rightMessage" format="string"></attr>//右侧文字 <attr name="rightMessageIsShow" format="boolean"></attr>//右侧文字是否显示 </declare-styleable> </resources>
三、资源文件layout布局(用到的图片资源或是dimen可以自己修改)
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="@dimen/base_action_bar_height" android:background="@color/base_action_bar_bg"> //返回按钮 <ImageView android:id="@+id/iv_left" android:layout_width="50dp" android:layout_height="match_parent" android:paddingLeft="@dimen/base_padding" android:paddingRight="@dimen/base_padding" android:scaleX="0.5" android:scaleY="0.5" android:src="@mipmap/base_btn_back_white" /> //中间标题 <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="标题" android:textColor="#fff" android:textSize="17sp" /> //右侧文字 <TextView android:id="@+id/tv_right" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:gravity="center_vertical" android:paddingLeft="@dimen/base_padding" android:paddingRight="@dimen/base_padding" android:text="其他" android:textColor="#fff" android:textSize="15sp" /> </RelativeLayout>
四、引用,分为xml引用和Activity里的引用
1、在xml里引用,效果图如下
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <!--这个一定是自己的包名路径,不知道的可以随便在一个类里new出一个BaseActionBar就可以找到包名 这个里面有三个重要的属性,即以app:开头的三个自定义属性, app:title是中间的title文字 app:rightMessage是右侧文字 app:rightMessageIsShow="true"右侧文字是否显示 且引用的时候注意在根布局里添加 xmlns:app="http://schemas.android.com/apk/res-auto"--> <com.baibai.bai.BaseActionBar android:id="@+id/base_action_bar" android:layout_width="match_parent" android:layout_height="@dimen/base_action_bar_height" app:rightMessageIsShow="true" app:rightMessage="我是右侧" app:title="支付方式" /> </LinearLayout>
2、在Activity里设置监听,跟button设置监听类似
class TestActivity : Activity() ,BaseActionBar.ActionBarTouchListener{ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_test) base_action_bar.setActionBarTouchListener(this) } override fun onActionBarLeft() { //左侧返回按钮监听 finish() } override fun onActionBarRight() { //右侧文字监听 startActivity(Intent(this, MainActivity::class.java)) } }