web-dev-qa-db-fra.com

comment définir une largeur égale à un autre widget sur android

J'ai besoin de dessiner une ligne horizontale sous un champ de texte de telle sorte que la largeur de la ligne soit égale à la largeur du texte (pas la largeur du plein écran).

Dans mon application, j'ai une vue textuelle sous une vue (ligne horizontale). largeur de la vue ligne doit être égal à largeur de la vue texte. J'ai essayé Android: layout_width = "wrap_content" et "match_parent", ce qui ne résout pas le problème.

Ceci est un exemple de codage xml:

         ......
        <TextView
            Android:id="@+id/textView1"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentTop="true"
            Android:layout_centerHorizontal="true"
            Android:layout_marginTop="28dp"
            Android:text="PopUpWindow"
            Android:textAppearance="?android:attr/textAppearanceLarge" />


            <View
                Android:id="@+id/separator"
                Android:layout_width="wrap_content"
                Android:layout_height="0.3dp"
                Android:layout_below="@+id/textView1"
                Android:background="#ffffff" />
             ......

l'image de l'écran est:

enter image description here

aidez-moi, s'il vous plaît.

37
M.A.Murali

Si vous utilisez un RelativeLayout, vous pouvez utiliser les attributs align-:

<View
    Android:id="@+id/separator"
    Android:layout_width="0dp"
    Android:layout_height="0.3dp"
    Android:layout_below="@+id/textView1"
    Android:layout_alignLeft="@+id/textView1"
    Android:layout_alignRight="@+id/textView1"
    Android:background="#ffffff" />
87
Jave

Si vous utilisez une mise en page autre qu'une mise en page relative, vous pouvez faire correspondre les largeurs de vos widgets par programme, comme dans cet exemple:

layout.xml:

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    >

    <TextView
        Android:id="@+id/text1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Here's some text"
        />

    <TextView
        Android:id="@+id/text2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Some more text"
        />
</LinearLayout>

Notez que les deux champs de texte sont tous deux définis sur wrap_content.

Main.Java:

TextView tv1 = (TextView) findViewById(R.id.text1);
TextView tv2 = (TextView) findViewById(R.id.text2);

if(tv1.getWidth() < tv2.getWidth())
    tv1.setWidth(tv2.getWidth());
else
    tv2.setWidth(tv1.getWidth());

Si vous avez plusieurs widgets que vous souhaitez avoir une largeur uniforme, répétez simplement le code ci-dessus pour le nouvel élément. Par exemple, disons qu'il y avait un bouton sur lequel je voulais ajuster la largeur, pour faire correspondre les autres éléments:

if(tv2.getWidth() < button)
    tv2.setWidth(button.getWidth());
else
    button.setWidth(tv2.getWidth());
6
Argus9

Utilisez RelativeLayout et utilisez ces deux attributs en vue de ligne horizontale

 Android:layout_alignLeft="@+id/textView1"     Android:layout_alignRight="@+id/textView1"




<RelativeLayout
        Android:id="@+id/relativeLayout1"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_weight="1.23" >

        <TextView
            Android:id="@+id/textView1"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentTop="true"
            Android:layout_centerHorizontal="true"
            Android:layout_marginTop="67dp"
            Android:text="this is TextView" />


        <TextView
            Android:id="@+id/textView2"
            Android:layout_width="wrap_content"
            Android:layout_height="10dp"
            Android:layout_alignLeft="@+id/textView1"
            Android:layout_alignRight="@+id/textView1"
            Android:layout_below="@+id/textView1"
            Android:background="#FF0000"
            Android:text="" />

    </RelativeLayout>
3
Ravi1187342

Si vous ne souhaitez pas utiliser RelativeLayout, vous pouvez définir la largeur du parent pour envelopper le contenu et la largeur du parent deviendra égale à l'enfant le plus grand. Ensuite, vous pouvez définir la largeur du petit enfant sur match_parent et cela correspondra à la largeur de la vue requise.

  <LinearLayout
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:gravity="center_vertical|left"
        Android:orientation="vertical"
        Android:layout_gravity="center_vertical"
        Android:padding="5dp">

        <TextView
            Android:id="@+id/navHeaderName"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_above="@+id/profile_progress_bar"
            Android:text="This is a large text"
            Android:textAppearance="@style/TextAppearance.AppCompat.Body1" />


        <ProgressBar
            Android:id="@id/profile_progress_bar"
            style="?android:attr/progressBarStyleHorizontal"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:max="100"
            Android:progress="45" />
    </LinearLayout>
2
Heisenberg

Ce que Jave a dit est correct - et le plus simple, mais que se passe-t-il si vous n'utilisez pas un RelativeLayout pour contenir les vues?

Si vous personnalisez votre interface utilisateur dans onCreate (), vous constaterez que l'obtention de la largeur à partir d'un autre widget vous donnera un résultat incorrect! C'est parce que l'interface utilisateur n'a pas encore été configurée.

Mais vous pouvez toujours configurer votre interface utilisateur dans onCreate ... exécutez simplement le code qui s'exécute après la configuration de l'interface utilisateur. Ceci est réalisé grâce à l'utilisation de la commande View.post().

Le XML:

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <LinearLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        Android:layout_centerHorizontal="true"
        Android:layout_centerVertical="true"
        Android:gravity="center">

        <Button
            Android:id="@+id/button_one"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginBottom="10dp"
            Android:text="short string" />

        <Button
            Android:id="@+id/button_two"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="this is a longer string" />

    </LinearLayout>

</RelativeLayout>

code Java:

private Button mButtonOne;
private Button mButtonTwo;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    // inflate UI
    setContentView(R.layout.activity_example);

    // get references to UI elements
    mButtonOne = (Button)findViewById(R.id.button_one);
    mButtonTwo = (Button)findViewById(R.id.button_two);

    // Make buttons the same size (i.e. Button1.width = Button2.width)
    if ((mButtonOne != null) && (mButtonTwo != null))
    {
        mButtonOne.post(new Runnable()
        {
            @Override
            public void run()
            {
                mButtonOne.setWidth(mButtonTwo.getWidth());
            }
        });
    }
}

Le résultat est que la largeur de button_one correspondra à la largeur de button_two. C'est un look plus agréable lorsque la quantité de texte varie fortement entre les deux vues.

2
Someone Somewhere

utilisez l'attribut width suivant.

 <TextView
        Android:id="@+id/textView1"
        Android:layout_width="150dp"
        Android:layout_height="wrap_content"
        Android:layout_alignParentTop="true"
        Android:layout_centerHorizontal="true"
        Android:layout_marginTop="28dp"
        Android:text="PopUpWindow"
        Android:textAppearance="?android:attr/textAppearanceLarge" />


        <View
            Android:id="@+id/separator"
            Android:layout_width="150dp"
            Android:layout_height="0.3dp"
            Android:layout_below="@+id/textView1"
            Android:background="#ffffff" />
0

Cela dépend de votre cas d'utilisation. Si vous envisagez de modifier des éléments de la disposition de manière dynamique et de les avoir également de la même taille que TextView, vous pouvez les regrouper dans une vue parent. Si c'est une chose unique, utilisez RelativeLayout comme suggéré par l'autre réponse ici.

<LinearLayout Android:orientation="vertical" ... > <!-- layout parameters as appropriate-->
<TextView
        Android:id="@+id/textView1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_alignParentTop="true"
        Android:layout_centerHorizontal="true"
        Android:layout_marginTop="28dp"
        Android:text="PopUpWindow"
        Android:textAppearance="?android:attr/textAppearanceLarge" />


        <View
            Android:id="@+id/separator"
            Android:layout_width="match_parent"
            Android:layout_height="0.3dp"
            Android:layout_below="@+id/textView1"
            Android:background="#ffffff" />

 </LinearLayout>
0
Jon O