尽管xml文件中的值发生了更改,但自定义工具栏中仍存在默认插入

时间:2018-03-05 11:59:31

标签: android

我根据工具栏创建了自定义视图:

public class CommonToolbar extends Toolbar {
   public CommonToolbar(Context context, AttributeSet attrs) {
      super(context, attrs);
      LayoutInflater.from(context).inflate(R.layout.common_toolbar, this, true);
}

common_toolbar.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="32dp"
    android:background="@color/colorPrimary"
    app:contentInsetStart="0dp">         

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/backIcon"
            style="@style/ToolbarNavigationButton"
            app:srcCompat="@drawable/icon_close" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true"
            android:layout_toEndOf="@+id/backIcon"
            android:gravity="center"
            android:text="Title"
            android:textStyle="bold" />

    </RelativeLayout>

</android.support.v7.widget.Toolbar>

正如您所看到的,我将属性 contentInsetStart 值设置为0,但是当我在任何布局文件中使用此工具栏时,仍然存在填充(image)。我可以通过更改目标布局文件中的 contentInsetStart 值来修改它,但我更喜欢将其保留在源xml中。为什么会这样?

2 个答案:

答案 0 :(得分:0)

由于您的自定义视图扩展了工具栏,因此您将xml工具栏扩展为工具栏。如果使用布局检查器查看布局,则视图层次结构将如下所示:

<CommonToolbar> (Subclass of Toolbar)
  <Toolbar>
    <RelativeLayout>
     ...

因此,当您通过xml设置contentInsetStart时,您将在内部工具栏上进行设置。外部工具栏仍有内容插入。

为避免这种情况,您可以让Common Toolbar扩展ViewGroup,即

public class CommonToolbar extends RelativeLayout {
  public CommonToolbar(Context context, AttributeSet attrs) {
    super(context, attrs);
    LayoutInflater.from(context).inflate(R.layout.common_toolbar, this, true);
}

或使用include标记对常用工具栏进行充气。即。

<include
  layout="@layout/common_toolbar"
  />

允许您删除CommonToolbar自定义视图

答案 1 :(得分:0)

使用setContentInsetsAbsolute(0,0);

public class CustomToolbar extends Toolbar {

@BindView(R.id.txt_screen_title)
TextView txtScreenTitle;


public CustomToolbar(Context context) {
    super(context);
    initToolbarLayout(context);
}

public CustomToolbar(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    initToolbarLayout(context);
}

public CustomToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initToolbarLayout(context);
}

private void initToolbarLayout(Context context) {
    View toolbarView = LayoutInflater.from(context).inflate(R.layout.app_toolbar, null);
    this.addView(toolbarView);
    ButterKnife.bind(this, toolbarView);
    setContentInsetsAbsolute(0, 0);
}

public void setScreenTitle(String title) {
    if(txtScreenTitle != null) {
        txtScreenTitle.setText(title);
    }
}

}