视图如何在没有负边距的情况下脱离其线性布局父边界?

how come a view gets out of its linear layout parent borders without negative margins?

我有这个 android 布局:

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">

      <LinearLayout
          android:id="@+id/display_name_layout"
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight="1"
          android:gravity="center_vertical"
          android:orientation="horizontal">
        <TextView
            android:id="@+id/account_display_name"
            ..."/>
        <ImageView
            ..."/>
      </LinearLayout>
      <LinearLayout
          android:id="@+id/account_name_layout"
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight="1"
          android:gravity="center_vertical"
          android:layout_marginBottom="1dp"
          android:orientation="horizontal">
        <TextView
            android:id="@+id/account_name"
            style="@style/AccountDataAccountName"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center_vertical"/>
        <ImageView
            android:id="@+id/account_name_chevron"
            android:layout_width="@dimen/account_menu_chevron_size"
            android:layout_height="@dimen/account_menu_chevron_size"
android:layout_marginTop="@dimen/account_menu_chevron_top_margin"
android:layout_marginLeft="@dimen/account_menu_chevron_left_margin"/>
      </LinearLayout>

    </LinearLayout>
  </LinearLayout>
  <FrameLayout
      android:id="@+id/close_and_recents"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:minWidth="@dimen/account_menu_header_horizontal_margin"
      android:orientation="horizontal"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintTop_toTopOf="parent">
    <ImageView
        android:id="@+id/close_button"
        android:layout_width="@dimen/account_menu_close_button_size"
        android:layout_height="@dimen/account_menu_close_button_size"
        android:layout_gravity="top|end"
        android:padding="@dimen/account_menu_close_button_padding"
        android:alpha="0"
        android:visibility="gone"/>

但是当我 运行 它的字体和屏幕尺寸都很大时,

我看到图片超出了线性布局。它隐藏在红色圆圈图像的后面(兄弟视图FrameLayout)。

怎么可能?

我没有设置负边距。

因为在那个 LinearLayout 中,首先您的 account_name textview 占用 space。所以当你 运行 使用大字体时,这个 textview 占据了 LinearLayout 的(几乎)整个宽度。现在布局将渲染下一个视图(图像视图),它将把它放在文本视图旁边。由于图像视图具有给定的固定尺寸,因此它将采用其 space 但不会显示,因为它超过了父级宽度。

如果仍然不清楚,请告诉我。

更新
对于下一个问题,您可以将 LinearLayout 更改为 RelativeLayout,如下所示:

<RelativeLayout
    android:id="@+id/account_name_layout"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:layout_marginBottom="1dp">

    <ImageView
        android:id="@+id/account_name_chevron"
        android:layout_width="@dimen/account_menu_chevron_size"
        android:layout_height="@dimen/account_menu_chevron_size"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="@dimen/account_menu_chevron_top_margin"
        android:layout_marginLeft="@dimen/account_menu_chevron_left_margin"/>

    <TextView
        android:id="@+id/account_name"
        style="@style/AccountDataAccountName"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:lines="1"
        android:ellipsize="end"
        android:layout_toLeftOf="@+id/account_name_chevron"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"/>
</RelativeLayout>

首先我们在布局的最右边绘制ImageView,然后我们从最左边到ImageView的开头绘制textView。因为相对布局具有 android:layout_toLeftOf 等属性。

更新2
根据您的要求尝试此代码。所以基本上我们正在做的是;我们首先绘制 textView 并给它一个 rightPadding 等于 iconSize + iconLeftMargin。所以现在 textView 将始终保持右侧的 space 图标。现在我们 rightAlign 带有 textView 的图标,因此当 textView 增加其 space 时,图标将随之移动。一旦它到达布局端,图标将仍然完全可见。 account_menu_chevron_size_plus_margin 这个维度等于 iconSize + iconLeftMargin

    <RelativeLayout
    android:id="@+id/account_name_layout"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:layout_marginBottom="1dp">

    <TextView
        android:id="@+id/account_name"
        style="@style/AccountDataAccountName"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:lines="1"
        android:ellipsize="end"
        android:paddingRight="@dimen/account_menu_chevron_size_plus_margin"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"/>

    <ImageView
        android:id="@+id/account_name_chevron"
        android:layout_width="@dimen/account_menu_chevron_size"
        android:layout_height="@dimen/account_menu_chevron_size"
        android:layout_centerVertical="true"
        android:layout_alignRight="@+id/account_name"
        android:layout_marginTop="@dimen/account_menu_chevron_top_margin"
        android:layout_marginLeft="@dimen/account_menu_chevron_left_margin"/>
</RelativeLayout>