【Bug修复】toolbar顶端与状态栏有间隙

写一个自定义ToolBar时候出现了一个坑,记录一下~

先看代码:

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.hivescm.wms.rf.R;

/**
 * Created by lyc on 2017/8/22 10:10.
 */

public class CustomToolBar extends Toolbar {
    private LayoutInflater inflater;

    private View mView;
    private TextView tv_left;
    private TextView tv_center;
    private TextView tv_rightMost;
    private TextView tv_rightSecond;
    private LinearLayout ll_back;
    private ImageView iv_back;

    private CustomToolbarListener listener;

    public CustomToolBar(Context context) {
        super(context);
    }

    public CustomToolBar(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView();
        initListener();
        setContentInsetsRelative(0, 0);
        setContentInsetStartWithNavigation(0);
    }

    public CustomToolBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
//        initView();
//        initListener();
    }

    private void initView() {
        if (mView == null) {
            inflater = LayoutInflater.from(getContext());
            mView = inflater.inflate(R.layout.toolbar_custom, null);
            tv_left = (TextView) mView.findViewById(R.id.tv_left);
            tv_center = (TextView) mView.findViewById(R.id.tv_center);
            tv_rightMost = (TextView) mView.findViewById(R.id.tv_rightMost);
            tv_rightSecond = (TextView) mView.findViewById(R.id.tv_rightSecond);
            ll_back = (LinearLayout) mView.findViewById(R.id.ll_back);
            iv_back = (ImageView) mView.findViewById(R.id.iv_back);
            //使用LayoutParams把控件添加到子view中
            LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER);
            addView(mView, lp);
        }
    }

    private void initListener() {
        ll_back.setOnClickListener(v -> listener.back(null));
    }

    public void setBackListener(CustomToolbarListener backListener) {
        this.listener = backListener;
    }

    @Override
    public void setTitle(CharSequence title) {
        if (tv_center != null) {
            if (!TextUtils.isEmpty(title)) {
                tv_center.setVisibility(VISIBLE);
                tv_center.setText(title);
            } else {
                tv_center.setVisibility(GONE);
            }
        }
    }

    public void setTvLeft(String tvLeft) {
        if (!TextUtils.isEmpty(tvLeft)) {
            tv_left.setVisibility(VISIBLE);
            tv_left.setText(tvLeft);
        } else {
            tv_left.setVisibility(GONE);
        }
    }

    public void setTvRightMost(String tvRightMost) {
        if (!TextUtils.isEmpty(tvRightMost)) {
            tv_rightMost.setVisibility(VISIBLE);
            tv_rightMost.setText(tvRightMost);
        } else {
            tv_rightMost.setVisibility(GONE);
        }
    }

    public void setTvRightSecond(String tvRightSecond) {
        if (!TextUtils.isEmpty(tvRightSecond)) {
            tv_rightSecond.setVisibility(VISIBLE);
            tv_rightSecond.setText(tvRightSecond);
        } else {
            tv_rightSecond.setVisibility(GONE);
        }
    }

    public interface CustomToolbarListener {

        void back(T t);
    }
}

这里是xml内容:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="#0000ff"
    >

    //原来这里的高度是50dp
    <LinearLayout
        android:id="@+id/ll_back"
        android:layout_width="40dp"
        android:layout_height="?attr/actionBarSize"
        android:gravity="center"
        >

        <ImageView
            android:id="@+id/iv_back"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:src="@drawable/left_back" />
    LinearLayout>

    <TextView
        android:id="@+id/tv_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/ll_back"
        android:layout_centerVertical="true"
        android:text="任务fff领取"
        android:maxLength="4"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/tv_center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="任务书 5"
        android:maxLength="6"
        android:textSize="16sp"
        />
    <TextView
        android:id="@+id/tv_rightSecond"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/tv_rightMost"
        android:layout_marginRight="10dp"
        android:text="数量 80"
        android:maxLength="5"
        android:textSize="16sp"
        />
    <TextView
        android:id="@+id/tv_rightMost"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:text="数量 80"
        android:maxLength="5"
        android:layout_marginRight="10dp"
        android:layout_alignParentRight="true"
        android:textSize="16sp"
        />
RelativeLayout>

原来的布局里面LinearLayout的高度是50dp,这里便出现了一个问题,用的时候发现toolBar总是与状态栏中间有间隙,我回去反复查代码都没有查到,后来请教同事才发现这里有一个问题。

当ll_back的高度被写死,没有问题,父布局wrap_content它也没有问题。但是在CustomToolBar里面addView的时候就有问题了,LayoutParams会覆盖掉原来RelativeLayout的属性,导致原来rl的宽高设置失效。这时候rl新的高度属性其实是wrap_content,当在activity中使用的时候,CutomToolBar的height指向的是rl原来的属性?attr/actionBarSize,这个值比LayoutParams的高度要大一些(因为此时LayoutParams的高度其实是LinearLayout‘布局中确定最大高度的控件’的高度50dp),所以就会有间隙。
这里需要把LinearLayout的高度与父布局RelativeLayout的高度属性保持一致,就不会出现这种情况了。
写代码还是一定要多细心一些,不然你永远都不知道会给自己留下怎样的坑。
再小的坑,也有你过不去的时候。。。

你可能感兴趣的:(Bug修复)