新建统一的标题栏
方法一
编写标题栏布局,需要使用共用的标题栏的时候直接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;
}
}
完结…