J'ai une LinearLayout
horizontale contenant une TextView
suivie d'une Spinner
à côté. Cette LinearLayout
est gonflée dynamiquement plusieurs fois dans une verticale LinearLayout
fixe contenue dans une RelativeLayout
.
Le problème est que, depuis que je suis passé de Theme.light
à Theme.holo.light
, la dernière ligne de TextView
est coupée en deux. Cela se produit lorsque le texte dynamique est long et couvre plusieurs lignes.
J'ai pu résoudre ce problème en ajoutant un remplissage inférieur à la LinearLayout
horizontale contenant les TextView
et Spinner
.
Cela ne ressemble pas à un correctif, mais plutôt à un hack. Quelqu'un peut-il me donner des conseils sur la façon de résoudre ce problème?
J'ai aussi lu d'autres questions, mais aucune ne semble aider.
Mise en page linéaire horizontale:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="horizontal">
<TextView
Android:id="@+id/textView1"
Android:layout_width="150dp"
Android:layout_height="wrap_content"
Android:layout_marginRight="20dp"
Android:text="TextView"/>
<Spinner
Android:id="@+id/spinner1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
</LinearLayout>
La disposition relative où la disposition ci-dessus est gonflée dynamiquement à la disposition linéaire avec l'id ll2_7:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<ScrollView
Android:id="@+id/scrollView"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_above="@+id/relLayoutButtonNext"
Android:layout_below="@id/textView1" >
<RelativeLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="20dp"
Android:paddingLeft="10dp"
Android:paddingRight="10dp"
Android:paddingTop="10dp" >
<TextView
Android:id="@+id/textView10"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:paddingRight="30dp"
Android:text="2.7" />
<TextView
Android:id="@+id/textView11"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginBottom="10dp"
Android:layout_toRightOf="@id/textView10"
Android:text="@string/question2_7" />
<LinearLayout
Android:id="@+id/ll2_7"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView11"
Android:layout_below="@+id/textView11"
Android:orientation="vertical" Android:layout_marginBottom="20dp">
</LinearLayout>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
EDIT: Voici la mise en page complète xml ci-dessus:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<TextView
Android:id="@+id/textView1"
style="@style/question_section_title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true"
Android:text="@string/question2_header" />
<RelativeLayout
Android:id="@+id/relLayoutButtonNext"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:background="@color/bottomBar"
Android:paddingBottom="3dp"
Android:paddingLeft="50dp"
Android:paddingRight="50dp"
Android:paddingTop="3dp" >
<Button
Android:id="@+id/buttonNext"
Android:layout_width="180dp"
Android:layout_height="wrap_content"
Android:layout_alignParentRight="true"
Android:onClick="NeXTSTEP"
Android:text="Next Section"
Android:textSize="20sp" />
<Button
Android:id="@+id/buttonPrevious"
Android:layout_width="180dp"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true"
Android:onClick="previousStep"
Android:text="Previous Section"
Android:textSize="20sp" />
</RelativeLayout>
<ScrollView
Android:id="@+id/scrollView"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_above="@+id/relLayoutButtonNext"
Android:layout_below="@id/textView1" >
<RelativeLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="20dp"
Android:paddingLeft="10dp"
Android:paddingRight="10dp"
Android:paddingTop="10dp" >
<TextView
Android:id="@+id/textView10"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:paddingRight="30dp"
Android:text="2.7" />
<TextView
Android:id="@+id/textView11"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginBottom="10dp"
Android:layout_toRightOf="@id/textView10"
Android:text="@string/question2_7" />
<LinearLayout
Android:id="@+id/ll2_7"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView11"
Android:layout_below="@+id/textView11"
Android:orientation="vertical" Android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
Android:id="@+id/textView2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView10"
Android:layout_below="@+id/ll2_7"
Android:text="2.8" />
<TextView
Android:id="@+id/textView3"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/ll2_7"
Android:layout_toRightOf="@+id/textView10"
Android:text="@string/question2_8" Android:layout_marginBottom="10dp"/>
<LinearLayout
Android:id="@+id/ll2_8"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView3"
Android:layout_below="@+id/textView3"
Android:layout_marginBottom="20dp"
Android:orientation="vertical" >
</LinearLayout>
<TextView
Android:id="@+id/textView4"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView2"
Android:layout_below="@+id/ll2_8"
Android:text="2.9" />
<TextView
Android:id="@+id/textView5"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/ll2_8"
Android:layout_toRightOf="@+id/textView10"
Android:text="@string/question2_9" Android:layout_marginBottom="10dp"/>
<LinearLayout
Android:id="@+id/ll2_9"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/textView5"
Android:layout_toRightOf="@+id/textView10"
Android:orientation="vertical" Android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
Android:id="@+id/textView6"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView4"
Android:layout_below="@+id/ll2_9"
Android:text="2.10" />
<TextView
Android:id="@+id/textView7"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/ll2_9"
Android:layout_toRightOf="@+id/textView10"
Android:text="@string/question2_10" Android:layout_marginBottom="10dp"/>
<LinearLayout
Android:id="@+id/ll2_10"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/textView7"
Android:layout_marginBottom="20dp"
Android:layout_toRightOf="@+id/textView10"
Android:orientation="vertical" >
</LinearLayout>
<TextView
Android:id="@+id/textView8"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView6"
Android:layout_below="@+id/ll2_10"
Android:text="2.11" />
<TextView
Android:id="@+id/textView9"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/ll2_10"
Android:layout_toRightOf="@+id/textView10"
Android:text="@string/quesiton2_11" Android:layout_marginBottom="10dp"/>
<LinearLayout
Android:id="@+id/ll2_11"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView9"
Android:layout_below="@+id/textView9"
Android:orientation="vertical" Android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
Android:id="@+id/textView12"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView8"
Android:layout_below="@+id/ll2_11"
Android:text="2.11.1" />
<TextView
Android:id="@+id/textView13"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/ll2_11"
Android:layout_toRightOf="@+id/textView10"
Android:text="@string/question2_11_1" Android:layout_marginBottom="10dp"/>
<LinearLayout
Android:id="@+id/ll2_11_1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/textView13"
Android:layout_toRightOf="@+id/textView10"
Android:orientation="vertical" Android:layout_marginBottom="20dp">
</LinearLayout>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
Après avoir essayé un million de choses différentes, je pense avoir la réponse.
J'ai appliqué une LayoutGravity
à l'élément TextView:
Android:layout_gravity="fill"
Semble résoudre tous les problèmes de coupure que j'ai eu. J'espère que cela aide quelqu'un avec le même problème.
J'ai rencontré le même problème que celui indiqué sur la capture d'écran. Cela est dû à l’alignement de la ligne de base dans la variable LinearLayout
horizontale. TextView
et Spinner
ont des lignes de base différentes en raison de la différence de taille de police. Pour résoudre le problème, il est nécessaire de désactiver l'alignement de la ligne de base pour la présentation en définissant:
Android:baselineAligned="false"
ou dans le code:
layout.setBaselineAligned(false);
J'ai eu le même problème et j'ai constaté que le simple fait d'ajouter
Android:includeFontPadding="false"
la dernière ligne de texte n'avait plus ses descendeurs coupés.
J'ai ajouté un espace factice après le texte en ajoutant
textView.setText(firstString+"\n");
J'ai essayé toutes les autres solutions.Mais c'était la seule solution qui fonctionnait pour moi
Lorsque cela se produit, vous devez vous assurer que la TextView
ne devient pas plus grande que son conteneur -
Si TextView
est défini sur wrap_content
et que son conteneur (ou un conteneur ancêtre) ne laisse pas de place pour que TextView
puisse s'y développer, il peut être obstrué.
Si ce n'est pas le cas, il est également possible que la onMeasure()
de la TextView
ne mesure parfois pas correctement les queues de lettres, les caractères non latins ou les effets du texte en italique. Vous pouvez corriger cela en définissant un style global pour votre TextView
afin qu'elle soit récupérée sans qu'il soit nécessaire de changer toute votre base de code:
Assurez-vous que votre application/vos activités utilisent un thème personnalisé, comme suit:
<style name="Custom" parent="@Android:style/Theme.Light">
<item name="Android:textViewStyle">@style/Custom.Widget.TextView</item>
</style>
<style name="Custom.Widget.TextView" parent="@Android:style/Widget.TextView">
<item name="Android:gravity">fill</item>
<item name="Android:padding">1sp</item>
</style>
La réponse de @Rynadt a été très utile pour atteindre le stade susmentionné. Le réglage de la gravité du texte dans la vue garantit que, sur certains appareils, l’occlusion ne se produit jamais (le texte est correctement inséré dans la vue), sur d’autres, un coup de main avec le remplissage d’une valeur sp, garantit la comptabilisation des queues et autres. avec une valeur spécifique à TextSize.
Placez le texte problématique dans un framelayout. Je pense que la vue du texte n'est pas calculée correctement à cause de la vue des frères et sœurs, Spinner.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="horizontal">
<FrameLayout
Android:layout_width="150dp"
Android:layout_height="wrap_content">
<TextView
Android:id="@+id/textView1"
Android:layout_width="150dp"
Android:layout_height="wrap_content"
Android:layout_marginRight="20dp"
Android:text="TextView"/>
</FrameLayout>
<Spinner
Android:id="@+id/spinner1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
</LinearLayout>
J'ai trouvé une solution différente en étendant TextView et en ajoutant une classe personnalisée comme celle-ci:
public class AdaptingTextView extends TextView {
public AdaptingTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public AdaptingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AdaptingTextView(Context context) {
super(context);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// set fitting lines to prevent cut text
int fittingLines = h / this.getLineHeight();
if (fittingLines > 0) {
this.setLines(fittingLines);
}
}
}
essayez de supprimer Android: paddingBottom = "20dp"
de
<RelativeLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="20dp"
Android:paddingLeft="10dp"
Android:paddingRight="10dp"
Android:paddingTop="10dp" >
Vous pouvez utiliser un écouteur de disposition global pour un TextView dans tout type de ViewGroup.
final TextView dSTextView = (TextView)findViewById(R.id.annoyingTextView);
dSTextView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
dSTextView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
float lineHeight = dSTextView.getLineHeight();
int maxLines = (int) (dSTextView.getHeight() / lineHeight);
if (dSTextView.getLineCount() != maxLines) {
dSTextView.setLines(maxLines);
}
}
});
Vous pouvez en lire plus à ce sujet ici
Ma solution était proche de celle acceptée, mais je devais la changer pour
Android:layout_gravity="fill_vertical"
au lieu. Sinon, les autres lignes auraient également été étendues avec des sauts de ligne ajoutés à des emplacements aléatoires. Par exemple, la plus grande ligne avait 4 lignes, donc une autre ligne a été modifiée de
this is a testphrase
à
thi
s is
a testph
rase
getViewTreeObserver().addOnGlobalLayoutListener
ne fonctionne pas dans une vue de recycleur. Si vous utilisez un recycleur, utilisez View.addOnLayoutChangeListener
:
J'ai trouvé que l'ellipsing que j'ai défini pour textView
dans le fichier xml n'était pas toujours reflété. Je l'ai donc défini par programme avant de réaffecter la propriété text. Cela a fonctionné pour moi.
textView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
textView.removeOnLayoutChangeListener(this);
float lineHeight = textView.getLineHeight();
int maxLines = (int) (textView.getHeight() / lineHeight);
if (textView.getLineCount() != maxLines) {
textView.setLines(maxLines);
textView.setEllipsize(TextUtils.TruncateAt.END);
// Re-assign text to ensure ellipsize is performed correctly.
textView.setText(model.getText());
}
}
});
Si vous rencontrez ce problème et que votre TextView
se trouve dans une RelativeLayout
, essayez de remplacer la RelativeLayout
par une LinearLayout
.
Cela a résolu le problème pour moi
Je pense que vous pouvez très peu faire pour que cela fonctionne en modifiant les dispositions. Comme j'ai constaté que certaines méthodes ne fonctionnent que dans certains cas. Je pense que cela dépend de la hiérarchie de la disposition et qu’il ne s’agit pas d’une solution universelle. J'ai également remarqué que cela se produit surtout lorsque vous souhaitez définir une police différente sur TextView.
Une méthode sure que j'ai testée et expérimentée consiste à définir les attributs de police dans le code une fois la vue gonflée. Je suppose que vous avez une police dans le dossier assets/fonts que vous souhaitez utiliser.
Par exemple dans un fragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_view, container, false);
TextView tv = (TextView)view.findViewById(R.id.text_view);
tv.setText("Insert text that needs to be displayed");
AssetManager assetManager = getContext().getAssets();
Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf");
tv.setTypeface(typeFace , 0); // 0 is normal font
tv.setPadding(10, 0, 10, 0); // This is not mandatory
}
Et dans une activité:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(Resource.Layout.main_activity);
TextView tv = (TextView)this.findViewById(R.id.text_view);
tv.setText("Insert text that needs to be displayed");
AssetManager assetManager = getContext().getAssets();
Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf");
tv.setTypeface(typeFace , 0); // 0 is normal font
tv.setPadding(10, 0, 10, 0); // This is not mandatory
}
J'ai le même problème et c'est très agaçant.
Cela n'arrive qu'avec du texte arabe.
Si vous faites l'étiquette multi-ligne et que vous ajoutez un \n
à la fin de votre chaîne, cela résoudra le problème, mais le problème est qu'il y aurait un grand écart entre cette étiquette et l'objet en dessous, car Le champ a maintenant une nouvelle ligne vide en dessous.
Un contrôle personnalisé peut être fait pour contourner cela. Mais dans l’ensemble, c’est un bug gênant.
La meilleure solution de contournement consiste à ajouter une vue fictive de la hauteur souhaitée (c’est-à-dire que cela ajoutera un rembourrage) au bas de votre vue.
<TableRow
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp" >
<View
Android:layout_width="match_parent"
Android:layout_height="30dp"/>
</TableRow>
Comme dans mon cas, j'ai ajouté une ligne supplémentaire au bas de la vue. J'espère que cela pourrait aider quelqu'un.
Je sais qu’il est si tard, mais c’est un travail charmant pour moi . Ajouter ce code à votre textview
Android:ellipsize="Marquee"
Android:layout_weight="1"
Ajoutez un remplissage au bas de la vue texte:
Android:paddingBottom="24dp"