视图如何在没有负边距的情况下脱离其线性布局父边界?
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>
我有这个 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>