Android: выровнять кнопку по нижнему правому краю экрана с помощью FrameLayout?

106

Я пытаюсь разместить элементы управления масштабированием карты в правом нижнем углу экрана. Я мог бы сделать это с помощью RelativeLayout, используя оба alignParentBottom="true"и alignParentRight="true", но с Framelayout я не нашел таких атрибутов. Как мне выровнять его по нижнему правому краю экрана?

Рохит Нандакумар
источник

Ответы:

252

На самом деле это возможно, несмотря на то, что сказано в других ответах. Если у вас есть элемент FrameLayout, и вы хотите разместить дочерний элемент внизу, вы можете использовать, android:layout_gravity="bottom"и это выровняет этот дочерний элемент по нижней части FrameLayout.

Я знаю, что это работает, потому что пользуюсь им. Я знаю, что уже поздно, но это может пригодиться другим, так как это занимает лидирующие позиции в Google

lblasa
источник
7
Привет, byte1918, если вы считаете, что это неправильный ответ на вопрос, пожалуйста, и я думаю, что это будет полезно для всех, если вы опубликуете правильное решение. Или хотя бы объясните, почему это неправильный ответ. Спасибо.
lblasa
33
Чтобы выровнять нижний правый угол, вы можете использовать android: layout_gravity = "bottom | right"
Марцин Рачковски
1
если это не сразу отражается в превью, попробуйте установить его на вкладке дизайна. обычно работает,
yUdoDis
Я пробовал это с Textview, и это не работает
The Only Smart Boy
51

Я тоже столкнулся с этой ситуацией и понял, как это сделать с помощью FrameLayout. Следующий вывод создается с помощью кода, приведенного ниже.

Некоторый текст с выравниванием по правому краю отображается поверх изображения с помощью FrameLayout.

              <FrameLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >

                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:src="@drawable/contactbook_icon"
                        android:layout_gravity="center" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="140"
                        android:textSize="12dp"
                        android:textColor="#FFFFFF"
                        android:layout_gravity="bottom|right"
                        android:layout_margin="15dp" />
                </FrameLayout>

Измените значение поля, чтобы отрегулировать положение текста на изображении. Удаление поля может иногда привести к тому, что текст будет выходить из поля зрения.

JaydeepW
источник
лучший ответ ... спасибо, разгадал давнюю загадку.
YvesLeBorg 08
38

Этого можно добиться с помощью RelativeLayout

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

   <ImageView 
      android:src="@drawable/icon"
      android:layout_height="wrap_content"
      android:layout_width="wrap_content"
      android:layout_alignParentRight="true"
      android:layout_alignParentBottom="true" />

</RelativeLayout>
Рохит Нандакумар
источник
1
Это не работает, если использовать wrap_contentв RelativeLayout. Потому что тогда RelativeLayout все равно масштабируется на весь экран.
Юра Шинкарев
15

Настройка android:layout_gravity="bottom|right"сработала для меня

Якоб
источник
9

Это можно сделать двумя способами:

1) Использование макета кадра

android:layout_gravity="bottom|right"

2) Использование относительного макета

android:layout_alignParentRight="true"
android:layout_alignParentBottom="true" 
Jorgesys
источник
5
android:layout_gravity="bottom"
superarts.org
источник
почему мы используем гравитацию, что конкретно для
blackHawk 04
3

Если вы хотите попробовать с java-кодом. Ну вот -

    final LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, 
                                             LayoutParams.WRAP_CONTENT);
    yourView.setLayoutParams(params);
    params.gravity = Gravity.BOTTOM; // set gravity
Рахул
источник
именно то, что я хочу. Небольшое дополнение - LayoutParams должен быть из FrameLayout.LayoutParams. И если вы хотите, чтобы это было в правом нижнем углу, используйте: params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
SajithK 07
2

вы можете добавить невидимый TextView в FrameLayout.

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:visibility="invisible"
        />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">
        <Button
            android:id="@+id/daily_delete_btn"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:text="DELETE"
            android:layout_gravity="center"/>
        <Button
            android:id="@+id/daily_save_btn"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:text="SAVE"
            android:layout_gravity="center"/>
    </LinearLayout>

ксимоед
источник
0

Есть много способов сделать это с помощью виджета ограничения на странице activity.xml студии android.

Два наиболее распространенных метода:

  1. Выберите вид кнопок и отрегулируйте поля.
  2. Перейдите в «Все атрибуты», затем в «layout_constraints», затем выберите
    • layout_constraintBottom_toBottomOf_parent
    • layout_constraintRight_toRightOf_parent
Павананджани Кумар
источник
-3

Вы не можете этого сделать с FrameLayout.

Из спецификации:

http://developer.android.com/reference/android/widget/FrameLayout.html

«FrameLayout предназначен для блокировки области на экране для отображения одного элемента. Вы можете добавить несколько дочерних элементов к FrameLayout, но все дочерние элементы привязаны к левому верхнему углу экрана».

Почему бы не использовать RelativeLayout?

Джухани
источник
Я хочу, чтобы список отображался слева, перекрывая карту. О, это возможно с RelativeLayout, не так ли? Хорошо, спасибо.
Рохит Нандакумар
1
«но все дочерние элементы привязаны к верхнему левому углу экрана» - не обязательно к верхнему краю экрана, вы можете выровнять его по правому, нижнему и т. д. правому краю?
Рохит Нандакумар
Да, это возможно с RelativeLayout. Вы можете размещать виды друг на друге.
Juhani
На самом деле это наполовину правильно. То, что спрашивает OP, достижимо, но, конечно, с ограниченным обзором, как вы упомянули. Но было бы неправильно говорить, что это «недостижимо»!
sud007