Comment créer deux vues dans Android qui utilisent 50% de hauteur chacun, sauf si un est plus petit?
Imaginez un écran D'appareil Android complet, je veux qu'il soit divisé en deux sections:
- la moitié supérieure contient du texte, qui peut être plus grand que l'espace disponible (ou non) et donc le texte fera défiler (C'est-à-dire TextView à l'intérieur D'une ScrollView)
- la moitié inférieure contient un contrôle MapView.
examen de certains scénarios précis:
- Si le texte est petit, je veux la carte pour plus d'espace, c'est à dire plus de 50%. Alors peut-être 20% de texte, 80% de carte.
- si le texte est plus grand, il ne prend QU'un MAXIMUM de 50% de l'espace de l'écran, puis défile. Donc 50% de carte, 50% de texte.
en ce moment j'ai assigné des poids aux deux parties, et ce n'est pas trop mal, mais si le texte est petit, la carte ne s'étend pas pour prendre l'espace, et la mise en page a un vide gaspillé que la carte pourrait utiliser utilement.
j'ai essayé des tas de combinaisons mais je ne vois pas comment faire. Il semble être un expérience commune pour moi que je sais ce que je veux, mais ne peut pas voir comment obtenir les vues disponibles pour le livrer. J'espère qu'il y a un moyen facile de faire ça.
n'hésitez pas à me faire ressembler à un imbécile et souligner l'évidence de l'attribut que j'ai raté :-)
======================================================================
autant que je puisse voir, il n'y a aucun moyen de le faire simplement en XML déclaratif et il doit le faire dans le code. J'ai mis le texte taille de la section à wrap_content, poids à 0 (pas de redimensionnement), et avoir la carte réglée à poids=1 (c.-à-d. occuper l'espace restant). Je vérifie ensuite si la section de texte (dans un ScrollView) prend trop de place et si c'est le cas, rétrécis-la. Ce code devrait être modifié pour prendre en charge une orientation différente de la mise en page.
private void fixLayoutProportions()
{
float maxPercentageOfScreenForText = 50/100;
LinearLayout container = (LinearLayout)findViewById(R.id.container);
ScrollView eventText = (ScrollView)findViewById(R.id.text_scroller);
int heightAvailable = container.getHeight();
int scrollerHeight = eventText.getHeight();
if ( scrollerHeight>(heightAvailable*maxPercentageOfScreenForText) ) // Text section using too much space
{
eventText.getLayoutParams().height = (int)(heightAvailable*maxPercentageOfScreenForText) ;
eventText.invalidate();
}
}
7 réponses
avez-vous essayé de mesurer la hauteur de votre écran au moment de l'exécution:
Display display = ((WindowManager)
getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getHeight();
ensuite, réglez votre vue supérieure max_height à width*0.5 et min_height à width*0.2. Votre vue du haut doit être un contrôle (comme TextView) qui possède les propriétés min_height et max_height. Aussi, mettez layout_weight à 0 ou laissez vide. Sur votre vue du bas réglez le poids de la mise en page à 1.
vous pouvez le faire en mettant tout dans LinearLayout et en changeant les paramètres suivants:
la façon la plus facile de faire 50/50 est en XML, c'est d'utiliser des poids de diffusion en ligne. Essentiellement mettre les deux vues dans une seule LinearLayout définir l'android:layout_weight sur les deux vues de l'enfant à la même valeur, comme mettre les deux à .5, 1, ou 42. Vous définissez ensuite layout_width à 0px ou fill_parent/match_parent.
La plus petite partie devient plus compliqué. Heureusement, vous pouvez désactiver la pesée en Java. Une façon est d'attendre que les fenêtres soient dessinées (si elles sont préremplies) et de les mesurer. Cela peut être fait, je pense qu'il a été appelé onWindowFocusChanged
Je n'ai pas testé cela, mais j'essaierais de configurer votre ScrollView pour avoir android:layout_weight="1"
et MapView
avoir android:layout_weight="0"
et android:minHeight="240dp"
. L'espoir est que minHeight aura priorité sur layout_weight.
je pense que vous devez définir mapviews hauteur de combler le parent et l'ensemble textviews hauteur que l'envelopper contetn et que pour le défilement vous avez à engager verticale scrool vrai pour l'affichage du texte et que vous nedded pas plus de 50% de l'espace textview vous pouvez définir maxheight propriété de textview.
je suis désolé si vous trouvez cette triviale. Mais je le suggère au cas où ça ne vous frapperait pas. Que diriez-vous d'utiliser la disposition relative et de garder le textview toujours au-dessus de la carte. Faire la gravité du sommet de textview, sa largeur match_parent, sa hauteur wrap_content et son poids 1(même que celui de la carte). De cette façon, votre textview changera en fonction de la taille du texte, tout en ne dépassant pas 50% en raison du poids. Comme pour la carte, l'utilisateur peut tirez la carte vers le bas pour voir le caché partie en vertu de textview. Ce sera comme s'il n'y avait pas de map sous textview(vous savez, à moins que vous ne vouliez rendre l'arrière-plan textview transparent qui, je pense, aurait l'air cool :) ). Je ne sais pas pour la vue sur la carte. Mais je suppose que ce sera quelque chose comme Google maps sur iphone, comme vous pouvez varier la taille en utilisant multi-touch et scroll en utilisant simple.
OK comme je vois son quelque chose comme u réservent à la moitié maximum de l'écran ur au TextView et si c'est plus il doit faire défiler. J'ai une solution, mais pour cela vous devrez corriger la max pas.l de lignes pour TextView, calcul qui peut être une douleur: P mais avoir une solution jamais le moins.
main.fichier xml
<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:maxLines="5"
android:id="@+id/tv1"
android:text="wsdvsv sjdgv jsdvn ksdjbn skjdb ksdnbk snbk snbjksn fkbj sfkbjn dfkjbndkjfbn kdjfnb kjdfnbkjdnfbk ndf bjkndf bndfjbn dfkbn jdfnbjdfnbjdfn bjdf nbkjdnf bkjdfnb kjdnfbkjdfn bkjndfbjndfjbndkjfbn dkfjbn kdjfnb kjdfnbkjdfnbjkd nfkjbndf"
/>
<TextView
android:layout_width="fill_parent"
android:layout_below="@id/tv1"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:maxLines="5"
android:text="Does it work ???"
/>
</RelativeLayout>
Fichier Java:
package com.android;
import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.widget.TextView;
public class TestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.tv1);
tv.setMovementMethod(new ScrollingMovementMethod());
}
}
si le texte est dit seulement en 2 lignes "Est-ce que ça marche?"déplacera automatiquement. Mais le seul problème que je vois ici c'est le maximum de lignes à 5, vous pouvez d'une valeur max de u je suppose que cela pourrait bien fonctionner :)
BR, J