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:
aidez-moi, s'il vous plaît.
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" />
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());
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>
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>
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.
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" />
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>