【Bug修復】toolbar頂端與狀態列有間隙
阿新 • • 發佈:2019-01-09
寫一個自定義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的高度屬性保持一致,就不會出現這種情況了。
寫程式碼還是一定要多細心一些,不然你永遠都不知道會給自己留下怎樣的坑。
再小的坑,也有你過不去的時候。。。