почему вид выходит из родительских границ линейного макета без отрицательных полей? - PullRequest
0 голосов
/ 02 октября 2018

У меня есть этот макет 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 голосов
/ 02 октября 2018

Потому что в этом LinearLayout сначала ваше account_name текстовое представление занимает место.Поэтому, когда вы запускаете с большим размером шрифта, это текстовое представление занимает (почти) полную ширину LinearLayout.Теперь макет будет отображать следующий вид (изображение), он будет размещен рядом с textView.Поскольку представление изображения имеет фиксированный размер, оно займет свое место, но не будет видимым, так как оно превышает родительскую ширину.

Если все еще не ясно, сообщите мне.

Обновить
Для вашего следующего вопроса вы можете изменить это 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 в крайнем правом углу макета, затем мы рисуем textView изкрайняя слева до запуска ImageView.Для Относительного макета есть свойства, такие как 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>

...