Attribuer la largeur à la moitié de la largeur d'écran disponible de manière déclarative

113

Est-il possible d'attribuer la largeur d'un widget à la moitié de la largeur d'écran disponible et de le faire en utilisant le XML déclaratif?

bugzy
la source

Réponses:

274

Si votre widget est un bouton:

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="2"
    android:orientation="horizontal">
    <Button android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="somebutton"/>

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

Je suppose que vous voulez que votre widget prenne la moitié et qu'un autre widget occupe l'autre moitié. L'astuce consiste à utiliser un LinearLayout, à définir layout_width="fill_parent"sur les deux widgets et à définir layout_weightla même valeur sur les deux widgets également. S'il y a deux widgets, tous deux avec le même poids, LinearLayout divisera la largeur entre les deux widgets.

synique
la source
15
Mieux vaut utiliser android: layout_width = "0dp" pour les deux éléments enfants, en évitant de les dimensionner deux fois.
tomash
2
Je n'ai jamais compris pourquoi vous deviez déclarer le layout_width = "0dp"
Andrew
Vous pouvez également utiliser <Space /> sur les versions ultérieures d'Android comme remplisseurs. Je pense que View est un peu plus léger que TextView si vous avez simplement l'intention de l'utiliser comme remplissage. layout_width = "0dp" est en fait l'approche recommandée selon la documentation Android.
Muz
Fonctionne très bien! Merci beaucoup!!
IcyFlame
1
@Andrew: parce que de cette façon, le moteur de rendu de mise en page n'essaye pas de travailler avec la largeur de mise en page du composant, il passe directement au partage de la largeur supplémentaire en fonction des poids.
njzk2
43

Utilisation de la disposition des contraintes

  1. Ajouter une ligne directrice
  2. Réglez le pourcentage sur 50%
  3. Contraignez votre vue à la ligne de guidage et au parent.

entrez la description de l'image ici

Si vous rencontrez des difficultés pour le changer en pourcentage, consultez cette réponse .

XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="81dp">

    <android.support.constraint.Guideline
        android:id="@+id/guideline8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5"/>

    <TextView
        android:id="@+id/textView6"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="TextView"
        app:layout_constraintBottom_toTopOf="@+id/guideline8"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
    
</android.support.constraint.ConstraintLayout>
Suragch
la source
Cela devrait être la meilleure réponse.
Jean Eric le
15

donnez une largeur de 0dp pour vous assurer que sa taille correspond exactement à son poids, cela garantira que même si le contenu des vues enfant s'agrandit, il sera toujours limité à exactement la moitié (en fonction de son poids)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1"
     >

    <Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="click me"
    android:layout_weight="0.5"/>


    <TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Hello World"
    android:layout_weight="0.5"/>
  </LinearLayout>
Rajesh Batth
la source
1
Je pense que android: layout_width = "0dp" est correct mais en définissant chaque poids à 0,5 et weitghtSum à leur somme, ce n'est pas nécessaire. Il semble que vous ayez juste besoin d'avoir le même poids sur les deux vues enfants.
jj_
5

Une autre façon pour un élément unique au centre, qui remplit la moitié de l'écran:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

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

        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2" />

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

</LinearLayout>
Denys_Sh
la source
1
<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
    android:id="@+id/textD_Author"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:text="Author : "
    android:textColor="#0404B4"
    android:textSize="20sp" />
 <TextView
    android:id="@+id/textD_Tag"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:text="Edition : "
    android:textColor="#0404B4"
    android:textSize="20sp" />
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:weightSum="1" >
    <Button
        android:id="@+id/btbEdit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="Edit" />
    <Button
        android:id="@+id/btnDelete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="Delete" />
</LinearLayout>
</LinearLayout>
Shahzad Shameer
la source
3
Bien que cet extrait de code puisse résoudre la question, inclure une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
gunr2171