自定义控件-----ActionBar

先声明,一下用的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))
    }

}

猜你喜欢

转载自blog.csdn.net/qq_36968707/article/details/81449408
今日推荐