共用ActionBar

新建统一的标题栏

在这里插入图片描述

方法一
编写标题栏布局,需要使用共用的标题栏的时候直接inflater进来,然后在当前Activity上进行设置标题,设置返回监听等处理。
方法二
方法一的升级版。在BaseActivity上进行共用标题栏的设置标题,设置返回监听等业务处理。在需要共用标题栏的Activity的布局上inflater标题栏布局,Activity调用BaseActivity中设置标题的方法,调用返回监听。
方法三
自定义View,在自定义View中去处理设置标题栏、返回监听的业务,使用的时候直接使用自定义View即可,Activity不需要做任何业务处理。

实现自定义标题栏的步骤如下:
1.定义style属性,实现在布局中直接配置标题文章、右侧"确定"等文字

 <declare-styleable name="LinxzActionBar">
        <attr name="titleStr" format="string"/>
        <attr name="rightStr" format="string"/>
    </declare-styleable>

2.编写actionBar布局文件

<?xml version="1.0" encoding="utf-8"?>
<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="48dp"
    android:background="@color/white"
    tools:ignore="RtlHardcoded,HardcodedText"
    android:id="@+id/layoutActionBar">
    
    <ImageView
        android:id="@+id/imgBack"
        android:src="@drawable/icon_back"
        android:layout_marginLeft="10dp"
        android:layout_gravity="center_vertical"
        android:scaleType="centerInside"
        android:layout_width="35dp"
        android:layout_height="35dp"
        tools:ignore="ContentDescription" />
    <View
        android:id="@+id/viewLine"
        android:layout_marginLeft="10dp"
        android:layout_gravity="center_vertical"
        android:background="@color/tv_hint"
        android:layout_width="1px"
        android:layout_height="25dp"/>
    <TextView
        android:id="@+id/tvTittle"
        android:textSize="16sp"
        android:layout_marginLeft="10dp"
        android:text=""
        android:textColor="@color/tv_normal"
        android:layout_gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:ignore="HardcodedText" />

    <View
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent"/>

    <TextView
        android:id="@+id/tvRight"
        android:gravity="center"
        android:text=""
        android:textColor="@color/black"
        android:textSize="14sp"
        android:layout_marginRight="15dp"
        android:layout_gravity="center_vertical"
        android:layout_width="45dp"
        android:layout_height="25dp" />

</LinearLayout>

3.编写自定义View控件

package com.linxz.ui.widgets;

import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.linxz.ui.R;

/**
 * @author Linxz
 * 创建日期:2019年06月10日 09:25
 * version:v4.0.1
 * 描述:
 */
public class LinxzActionBar extends FrameLayout {
    private Context mContext;
    private ImageView imgBack;
    private View viewLine;
    private TextView tvTittle;
    private TextView tvRight;
    private OnActionBarLeftClickListener leftClickListener;
    private OnActionBarRightClickListener rightClickListener;
    private String tittleStr;
    private String rightStr;
    public LinxzActionBar(@NonNull Context context) {
        super(context);
    }

    public LinxzActionBar(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
        this.mContext=context;
        init();
        setListener();
    }

    public LinxzActionBar(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LinxzActionBar, defStyleAttr, 0);

        tittleStr = a.getString(R.styleable.LinxzActionBar_titleStr);
        rightStr = a.getString(R.styleable.LinxzActionBar_rightStr);
        a.recycle();
    }

    private void init(){
        inflate(mContext, R.layout.ui_inflate_action_bar,this);
        imgBack=findViewById(R.id.imgBack);
        viewLine=findViewById(R.id.viewLine);
        tvTittle=findViewById(R.id.tvTittle);
        tvRight=findViewById(R.id.tvRight);
        if (!TextUtils.isEmpty(tittleStr)){
            tvTittle.setText(tittleStr);
        }
        if (!TextUtils.isEmpty(rightStr)){
            tvRight.setText(rightStr);
        }
    }

    private void setListener(){
        imgBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (leftClickListener!=null){
                    leftClickListener.onLeftClick();
                }else{
                    Activity activity=getActivity(mContext);
                    if (activity!=null){
                        activity.finish();
                    }
                }
            }
        });
        tvRight.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (rightClickListener!=null){
                    rightClickListener.onRightClick();
                }
            }
        });
    }

    public LinxzActionBar setListener(OnActionBarLeftClickListener leftClickListener){
        this.leftClickListener=leftClickListener;
        return this;
    }

    public LinxzActionBar setListener(OnActionBarRightClickListener rightClickListener){
        this.rightClickListener=rightClickListener;
        return this;
    }

    private Activity getActivity(Context context){
        if (context instanceof Activity){
            return ((Activity) context);
        }else if (context instanceof ContextWrapper){
            ContextWrapper wrapper = (ContextWrapper) context;
            return getActivity(wrapper.getBaseContext());
        }else{
            Toast.makeText(context,"关闭Activity失败",Toast.LENGTH_SHORT).show();
            return null;
        }
    }

    public void setTittle(String strTittle){
        tvTittle.setText(strTittle);
    }

    public void setViewLinevisible(int visible){
        viewLine.setVisibility(visible);
    }

    public void setLeftIcon(@DrawableRes int drawableLeft){
        imgBack.setImageResource(drawableLeft);
    }

    public void setLeftIcon(Drawable drawableLeft){
        imgBack.setImageDrawable(drawableLeft);
    }


    public interface OnActionBarRightClickListener{
        void onRightClick();
    }

    public interface OnActionBarLeftClickListener{
        void onLeftClick();
    }
}

4.自定义View控件的使用:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:background="@color/bg_page">

    <com.linxz.ui.widgets.LinxzActionBar
        app:titleStr="在这里自己填写标题吧"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

这样就实现了共用ActionBar
划重点
在自定义View中需要实现Activity的返回逻辑,需要实现该功能必须要拿到对应的Activity,以下是根据Context获取对应的Activity的方法:

    private Activity getActivity(Context context){
        if (context instanceof Activity){
            return ((Activity) context);
        }else if (context instanceof ContextWrapper){
            ContextWrapper wrapper = (ContextWrapper) context;
            return getActivity(wrapper.getBaseContext());
        }else{
            Toast.makeText(context,"关闭Activity失败",Toast.LENGTH_SHORT).show();
            return null;
        }
    }

完结…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值