Относительная компоновка Android с шириной кнопки с использованием веса
Я использовал параметр layout_weight
, чтобы установить ширину кнопок на 70% от общей ширины макета, но кажется, что мне не хватает некоторых важных деталей, чтобы заставить его работать.
(Еще одно решение - работать с программным обеспечением display.getWidth()
, но это тоже не сработает, потому что я не знаю, как должен выглядеть мой .xml. Если я решит установить ширину с помощью button.setWidth()
)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_weight="1.0">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15px"
android:id="@+id/userVersionTextViewNew"
android:gravity="center"
android:layout_centerVertical="true"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15px"
android:gravity="center"
android:layout_above="@id/userVersionTextViewNew"
android:id="@+id/userSoftSerialNumberTextView"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/logo_200"
android:layout_above="@id/userSoftSerialNumberTextView"
android:layout_centerHorizontal="true"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15px"
android:gravity="center"
android:layout_below="@id/userVersionTextViewNew"
android:id="@+id/dummyTextView"/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/loginButton"
android:text="Σύνδεση"
android:layout_centerHorizontal="true"
android:layout_below="@id/dummyTextView"
android:layout_weight="0.7"/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/demoLoginButton"
android:text="Δοκιμαστική χρήση"
android:layout_centerHorizontal="true"
android:layout_below="@id/loginButton"
android:layout_weight="0.7"/>
</RelativeLayout>
Ответы
Ответ 1
Попробуйте это.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15px"
android:id="@+id/userVersionTextViewNew"
android:gravity="center"
android:layout_centerVertical="true"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15px"
android:gravity="center"
android:layout_above="@id/userVersionTextViewNew"
android:id="@+id/userSoftSerialNumberTextView"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/logo_200"
android:layout_above="@id/userSoftSerialNumberTextView"
android:layout_centerHorizontal="true"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15px"
android:gravity="center"
android:layout_below="@id/userVersionTextViewNew"
android:id="@+id/dummyTextView"/>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity = "center_horizontal"
android:layout_below="@id/dummyTextView"
android:id="@+id/loginButtonLayout"
android:weightSum="1.0">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/loginButton"
android:text="Σύνδεση"
android:layout_weight="0.7"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity = "center_horizontal"
android:layout_below="@id/loginButtonLayout"
android:weightSum="1.0">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/demoLoginButton"
android:text="Δοκιμαστική χρήση"
android:layout_weight="0.7"/>
</LinearLayout>
</RelativeLayout>
Ответ 2
Проблема
Вы не можете использовать параметры layout_weight в RelativeLayout. Это параметры из LinearLayout. Ниже я расскажу о различиях ниже. Но сначала о решении по этому вопросу
Решение
Используйте LinearLayout, где вы можете позиционировать элементы в строке с распределением веса. Не забудьте использовать ширину 0dp при добавлении layout_weights, хотя! В приведенном ниже примере показано распределение веса 70/30.
<LinearLayout
android:id="@+id/wrapper"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="1.0" >
<Button
android:text="left"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".70" />
<Button
android:text="right"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".30" />
</LinearLayout>
Все это в RelativeLayout, которое вы уже имели в своем коде. Остальная часть этого ответа - это справочная информация, которую каждый читатель должен прочитать, чтобы понять, что они делают.
RelativeLayout
Всякий раз, когда вы начинаете с макета с более чем одним элементом, я советую вам предпочесть RelativeLayout в пользу линейной вещи. RelativeLayout очень мощный и позволяет позиционировать элементы по отношению друг к другу (leftOf, ниже,...). В большинстве случаев это больше, чем вам когда-либо понадобится.
Пример из документа разработки Android (поверьте мне все это):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp" >
<EditText
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/reminder" />
<Spinner
android:id="@+id/dates"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_below="@id/name"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/times" />
<Spinner
android:id="@id/times"
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/name"
android:layout_alignParentRight="true" />
<Button
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/times"
android:layout_alignParentRight="true"
android:text="@string/done" />
</RelativeLayout>
LinearLayout
LinearLayout может показаться очень способным, но для того, чтобы все было отсортировано только с Linears, вы, скорее всего, начнете разворачивать эти макеты. И что там, где он становится уродливым, мудрым.
Снова пример из документации по разработке Android.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:orientation="vertical" >
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/to" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/subject" />
<EditText
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="top"
android:hint="@string/message" />
<Button
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="@string/send" />
</LinearLayout>
Ответ 3
Я не думаю, что layout_weight
работает внутри RelativeLayout
. Возможно, вы должны добавить LinearLayout
внутри RelativeLayout
и использовать layout_weight
внутри.
Кроме того, при использовании layout_weight
вы обычно должны иметь либо ширину, либо высоту объекта, определенного как 0dp
, поэтому в вашем случае:
android:layout_weight="0.7"
android:layout_height="0dp"
Ответ 4
Я знаю, что этот вопрос старый, но только для тех, кто ищет решение:
Google представил новый API под названием android.support.percent
PercentRelativeLayout
точно ваш случай:
<android.support.percent.PercentRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<!-- Other controls -->
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/loginButton"
android:text="Σύνδεση"
android:layout_centerHorizontal="true"
android:layout_below="@id/dummyTextView"
app:layout_widthPercent="70%"/>
<!-- Other controls -->
</android.support.percent.PercentRelativeLayout>
Ответ 5
layout_weight, работает с LinearLayout как родительский. поэтому я думаю, что проблема кроется там. вам нужно использовать сочетание всех линейных макетов и относительных макетов для достижения того, что вам нужно.
Ответ 6
Я думаю, что вы не должны определять android:layout_weight="1.0"
в теге Relative layout, если вы хотите установить длину кнопки other, а затем "wrap_content"
Ответ 7
Как правильно сказал @hcpl в своем ответе:
Вы не можете использовать параметры layout_weight в RelativeLayout. Это параметры из LinearLayout.
Да, он прав! Но подумайте о отрицательном воздействии на производительность, вызванном вложенными макетами.
С введением ConstraintLayout вы можете решить свою проблему без вложенного LinearLayout. Вы просто вставляете два вертикальных правила с полями 15% и 85% и размещаете между ними кнопки.
Здесь исходный код макета:
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent">
<TextView
android:id="@+id/userVersionTextViewNew"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:text="userVersionTextViewNew"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/userSoftSerialNumberTextView"
app:layout_constraintVertical_chainStyle="packed" />
<TextView
android:id="@+id/userSoftSerialNumberTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:text="userSoftSerialNumberTextView"
app:layout_constraintTop_toBottomOf="@+id/userVersionTextViewNew"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/imageView" />
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/logo_200"
app:layout_constraintTop_toBottomOf="@+id/userSoftSerialNumberTextView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/dummyTextView" />
<TextView
android:id="@+id/dummyTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:text="dummyTextView"
app:layout_constraintTop_toBottomOf="@+id/imageView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/loginButton" />
<Button
android:id="@+id/loginButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Σύνδεση"
app:layout_constraintTop_toBottomOf="@+id/dummyTextView"
app:layout_constraintLeft_toLeftOf="@+id/leftGuideline"
app:layout_constraintRight_toLeftOf="@+id/rightGuideline"
app:layout_constraintBottom_toTopOf="@+id/demoLoginButton" />
<Button
android:id="@+id/demoLoginButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Δοκιμαστική χρήση"
app:layout_constraintTop_toBottomOf="@+id/loginButton"
app:layout_constraintLeft_toLeftOf="@+id/leftGuideline"
app:layout_constraintRight_toLeftOf="@+id/rightGuideline"
app:layout_constraintBottom_toBottomOf="parent" />
<android.support.constraint.Guideline
android:id="@+id/leftGuideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.15" />
<android.support.constraint.Guideline
android:id="@+id/rightGuideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.85" />
</android.support.constraint.ConstraintLayout>
В результате вы получите следующее представление:
Вы можете найти более подробную информацию в Построение интерфейсов с помощью ConstraintLayout.
Ответ 8
Попробуйте это,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical"
android:layout_weight="10">
<TextView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:textSize="15px"
android:id="@+id/userVersionTextViewNew"
android:layout_weight="0.75"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:textSize="15px"
android:layout_weight="0.75"
android:id="@+id/userSoftSerialNumberTextView"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:src="@drawable/logo_200"
android:layout_weight="0.75"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:textSize="15px"
android:layout_weight="0.75"
android:id="@+id/dummyTextView"/>
<Button
android:layout_width="fill_parent"
android:layout_height="0dp"
android:id="@+id/loginButton"
android:text="Σύνδεση"
android:layout_weight="3.5"/>
<Button
android:layout_width="fill_parent"
android:layout_height="0dp"
android:id="@+id/demoLoginButton"
android:text="Δοκιμαστική χρήση"
android:layout_weight="3.5"/>
</LinearLayout>
Ответ 9
Сначала добавьте параметр android:weightSum="1.0"
в контейнер (в этом случае добавьте его в RelativeLayout).
Затем определите вес каждого из своих детей. Например, если вы добавите к кнопке этот
android:layout_weight="0.5"
android:layout_width="0px"
кнопка займет 50% от общей ширины.