1. 程式人生 > >【Bug修復】toolbar頂端與狀態列有間隙

【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<T> { 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的高度屬性保持一致,就不會出現這種情況了。
寫程式碼還是一定要多細心一些,不然你永遠都不知道會給自己留下怎樣的坑。
再小的坑,也有你過不去的時候。。。