web-dev-qa-db-fra.com

Android: dernière ligne de textview coupée

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.

enter image description here

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>
102
Rynardt

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.

253
Rynardt

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);
38
Jusid

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.

23
Thorinside

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

9
Ameer

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.

5
Graeme

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>
5
Rubin Yoo

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);
        }
    }

}
5
Display name

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" >
4
Dheeresh Singh

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

3
Jim Baca

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
3
Spookysister

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());
            }
        }
    });
3
mp501

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

2
JesperB

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
}
1
Mahesh Iyer

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. 

1
Adel Ammari

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.

0
Anuj Sharma

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"
0
dewy

Ajoutez un remplissage au bas de la vue texte:

Android:paddingBottom="24dp"
0
Phil