Можете ли вы центрировать кнопку в RelativeLayout?


175

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


1
Язык? Фреймворк? ОПЕРАЦИОННЫЕ СИСТЕМЫ?
Арнольд Спенс

3
@ Арнольд Спенс: ты побил меня на 24 секунды :)
Nippysaurus

3
Извините, я впервые использую Stack Overflow. Да, я разрабатываю для Android. =)
Аркадия

7
Без проблем. Правильные метки быстрее привлекут внимание правых людей. Исправлено :)
Арнольд Спенс

8
+1 к Арнольду Спенсу за тактичность. Некоторые люди на SO устно уничтожили бы OP за то, что они просто «новые».
Subby

Ответы:


371

Пытаться

android:layout_centerHorizontal="true"

Именно так это работает для меня:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="#ff0000">

    <Button
        android:id="@+id/btn_mybutton"
        android:layout_height="wrap_content"
        android:layout_width="124dip"
        android:layout_marginTop="5dip"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>

5
Я не работаю, если у вас есть match_parent для вашей ширины.
Готи,

2
Если у вас есть match_parent для вашей ширины, он уже центрирован по горизонтали.
ataulm

103

Вы можете использовать CENTER_IN_PARENT для относительного расположения.

Добавьте android:layout_centerInParent="true"к элементу, который вы хотите центрировать в RelativeLayout


Это центрируется по горизонтали и вертикали, как насчет layout_centerHorizont = true
user3076750

37

Аркадия, просто попробуй код ниже. Есть несколько способов получить результат, который вы ищете, это один из самых простых способов.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relative_layout"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:gravity="center">

    <Button
        android:id="@+id/the_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Centered Button"/>
</RelativeLayout>

Установка силы тяжести самого RelativeLayout повлияет на все объекты, размещенные внутри него. В данном случае это просто кнопка. Конечно, здесь вы можете использовать любые настройки гравитации (например, center_horizontal, top, right и т. Д.).

Вы также можете использовать этот код ниже:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relative_layout"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">

    <Button
        android:id="@+id/the_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Centered Button"
        android:layout_centerInParent="true"/>
</RelativeLayout>

1
Спасибо. Однако, если бы у меня было несколько кнопок, и я хотел, чтобы одна из них была центрирована, как бы я это сделал? Первый код будет центрировать все внутри родительского относительного размещения. Кроме того, как я мог центрировать кнопку в верхней части строки?
Аркадия

Просто используйте второй пример и добавьте centerInParent только к кнопке, которую вы хотите центрировать. Вы также можете использовать centerHorizontally и layout_alignParentTop, чтобы выровнять его по верху и отцентрировать по горизонтали. Что именно вы пытаетесь достичь, я могу привести лучший пример.
Кевин Коппок

Я только начинаю изучать разработку Android и пытаюсь полностью понять, как манипулировать вещами, чтобы делать то, что я хочу. По сути, я хочу держаться подальше от выравнивания объектов по пикселям, потому что картинка может выглядеть очень по-разному на другом типе экрана / разрешении. Однако, когда вы используете команду гравитации, все следует за ней. Я попытался отключить гравитацию для кнопки с помощью ignoreGravity, и это не сработало. Это очень сложно.
Аркадия

Да, это определенно может быть. Есть много способов сделать любой конкретный макет. Лучший способ - сделать набросок в своей голове так, как вы хотите, и идти оттуда. Это краткое руководство может помочь и некоторым: developer.android.com/resources/tutorials/views/…
Кевин Коппок

Да, я действительно делал этот урок. Я прохожу каждый учебник и изучаю, как полностью им манипулировать, иначе я не пойму, чем он отличается.
Аркадия

25

Обобщенная

Добавление:

android:layout_centerInParent="true"

просто работает на RelativeLayout, если для представления также установлен один из следующих атрибутов:

android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"

который выравнивает дочернее представление к родительскому представлению. «Центр» основан на выбранной вами оси выравнивания:

влево / вправо -> вертикальный

верх / низ -> горизонтальный

Установка гравитации childs / контента внутри вида:

android:gravity="center"

центрирует дочерний элемент в родительском представлении в любом случае, если не установлено выравнивание. По желанию вы можете выбрать:

<!-- Axis to Center -->
android:gravity="center_horizontal"
android:gravity="center_vertical"

<!-- Alignment to set-->
android:gravity="top"
android:gravity="bottom"
android:gravity="left"
android:gravity="right"
android:gravity="fill"
...

Тогда есть:

android:layout_gravity="center"

который центрирует сам вид внутри своего родителя

И, наконец, вы можете добавить следующий атрибут в представление родителей:

android:layout_centerHorizontal="true"
android:layout_centerVertical="true"

7

Используйте атрибут android:centerInParent="true"внутри вида, когда вы хотите центрировать вид в Относительном макете.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="NWE"
        android:textSize="30dp"/>
</RelativeLayout>

5

Это легко, не выравнивайте это ни с чем

<Button
        android:id="@+id/the_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_centerInParent="true"
        android:text="Centered Button"/>


2

Для выравнивания по центру в одном из направлений используйте android: layout_centerHor horizontal = "true" или android: layout_centerVertical = "true" в дочернем макете


1

Удаление любого выравнивания, такого как android: layout_alignParentStart = "true" и добавление centerInParent работало для меня. Если «выравнивание» остается, centerInParent не работает


1

Это действительно легко. Попробуйте код ниже,

<RelativeLayout
    android:id="@+id/second_RL"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/first_RL"
    android:background="@android:color/holo_blue_bright"
    android:gravity="center">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</RelativeLayout>

1
Ответы только по коду здесь не приветствуются. Попробуйте опубликовать более подробную информацию о том, почему приведенный выше ответ будет работать. :)
Вивз

Спасибо за руководство. Я новичок здесь.
Прим

0

Вы должны выровнять его слева или справа от родительского представления

не используйте ни один из них при использовании android:centerInParent="true"кодов: -

android:layout_alignParentLeft="true"

android:layout_alignParentLeft="true"

android:layout_alignRight=""

и т.п.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.