写一个自定义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的高度属性保持一致,就不会出现这种情况了。
写代码还是一定要多细心一些,不然你永远都不知道会给自己留下怎样的坑。
再小的坑,也有你过不去的时候。。。