视图如何摆脱线性布局父边界而没有负边距?

时间:2018-10-02 17:43:37

标签: android layout android-linearlayout android-framelayout

我有这个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中的视图)。

怎么可能?

我没有设置负边距。

enter image description here

1 个答案:

答案 0 :(得分:1)

因为在该LinearLayout中,您的account_name文本视图首先占据了空间。因此,当您以大字体运行时,此textview会占用LinearLayout的(几乎)完整宽度。现在,布局将呈现下一个视图(图像视图),并将其放置在textView旁边。由于imageview具有固定的尺寸,因此会占用其空间,但会超出父级宽度,因此将不可见。

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

更新
对于下一个问题,您可以将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等。

Update2
根据您的要求尝试此代码。因此,基本上我们正在做的是;我们先绘制textView,然后给它rightPadding等于iconSize + iconLeftMargin。因此,textView现在将始终在其右侧保留用于图标的空间。现在我们用rightAlign textView图标,所以随着textView增加其空间,图标将随之移动。一旦到达布局末端,图标仍将完全可见。 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>