wake-up-neo.com

Android: Letzte Zeile der Textansicht abgeschnitten

Ich habe eine horizontale LinearLayout, die eine TextView gefolgt von einer Spinner daneben enthält. Diese LinearLayout wird in einer festen vertikalen LinearLayout, die in einer RelativeLayout enthalten ist, mehrmals dynamisch aufgeblasen.

Das Problem ist, dass, seit ich von Theme.light zu Theme.holo.light gewechselt habe, die letzte Zeile der TextView halbiert wird. Dies geschieht, wenn der dynamische Text lang ist und mehr als eine Zeile umfasst.

enter image description here

Ich konnte dieses Problem beheben, indem ich der horizontalen LinearLayout, die TextView und Spinner enthielt, Bottom-padding hinzufügte.

Das fühlt sich nicht nach einem Fix an, sondern eher nach einem Hack. Kann mir jemand bitte einen Rat geben, wie ich das richtig beheben kann?

Ich habe auch einige andere Fragen gelesen, aber keine scheint zu helfen.

Horizontal lineares Layout:

<?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>

Relatives Layout, bei dem das obige Layout bei linearem Layout mit der ID ll2_7 dynamisch aufgeblasen wird:

<?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: Hier ist die vollständige Layout-XML für oben:

<?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

Nachdem ich eine Million verschiedene Dinge ausprobiert habe, glaube ich, habe ich die Antwort.

Ich habe eine LayoutGravity auf das TextView-Element angewendet:

Android:layout_gravity="fill"

Scheint, alle Clipping-Probleme zu lösen, die ich hatte. Hoffe das hilft jemandem mit dem gleichen Problem.

253
Rynardt

Ich habe das gleiche Cut-Off-Problem wie auf dem Screenshot gesehen. Ursache ist die Grundlinienausrichtung in der horizontalen LinearLayout. TextView und Spinner haben unterschiedliche Basislinien aufgrund der unterschiedlichen Schriftgrößen. Um das Problem zu beheben, müssen Sie die Grundlinienausrichtung für das Layout deaktivieren, indem Sie Folgendes festlegen:

Android:baselineAligned="false"

oder im Code:

layout.setBaselineAligned(false);
38
Jusid

Ich hatte das gleiche Problem und stellte fest, dass es einfach hinzugefügt wurde 

Android:includeFontPadding="false"

die letzten Textzeilen wurden nicht mehr abgeschnitten.

23
Thorinside

Ich fügte etwas Dummy-Leerzeichen nach dem Text hinzu

textView.setText(firstString+"\n");

Ich habe alle anderen Lösungen ausprobiert. Aber das war die einzige Lösung, die für mich funktionierte

9
Ameer

In diesem Fall sollten Sie sicherstellen, dass TextView nicht größer als der Container wird. 

Wenn ein TextView auf wrap_content gesetzt ist und der Container (oder ein Vorfahrcontainer) keinen Platz für das TextView lässt, in den hineinwachsen kann, kann dies verdeckt werden.

Wenn dies nicht der Fall ist, ist es auch möglich, dass die onMeasure() des TextView die Schwänze von Buchstaben, nicht lateinischen Zeichen oder die Auswirkungen von kursivem Text nicht richtig misst. Sie können dies korrigieren, indem Sie einen globalen Stil für TextView festlegen, damit er abgerufen wird, ohne dass Sie Ihre gesamte Codebasis ändern müssen:

Stellen Sie sicher, dass Ihre Anwendung/Ihre Aktivitäten ein benutzerdefiniertes Thema verwenden, wie folgt:

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

Die Antwort von @Rynadt war wirklich hilfreich, um zur obigen Stufe zu gelangen. Durch die Einstellung der Schwere des Textes in der Ansicht wird auf einigen Geräten sichergestellt, dass keine Okklusion stattfindet (der Text ist korrekt in die Ansicht eingepasst), in anderen Fällen hilft eine Hilfe beim Auffüllen eines sp-Werts, dass die Endpunkte usw. berücksichtigt werden mit einem TextSize-spezifischen Wert.

5
Graeme

Legen Sie die problematische Textansicht in ein Rahmenlayout. Ich denke, die Textansicht wird aufgrund der Geschwisteransicht, Spinner, nicht richtig berechnet. 

<?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

Ich habe eine andere Lösung gefunden, indem ich TextView erweitert und eine benutzerdefinierte Klasse wie folgt hinzugefügt habe:

 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

versuchen Sie es mit dem Entfernen von Android: paddingBottom = "20dp"

von 

 <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

Sie können einen globalen Layout-Listener für eine TextView in jeder Art von ViewGroup verwenden.

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

    }
});

Sie können mehr darüber lesen hier

3
Jim Baca

Meine Lösung war nahe an der akzeptierten, aber ich musste sie ändern

   Android:layout_gravity="fill_vertical"

stattdessen. Ansonsten wären die anderen Zeilen auch mit zusätzlichen Zeilenumbrüchen an zufälligen Stellen gestreckt worden. Zum Beispiel hatte die größte Zeile 4 Zeilen, sodass eine andere Zeile geändert wurde 

this is a testphrase

zu

thi
s is
a testph
rase
3
Spookysister

getViewTreeObserver().addOnGlobalLayoutListener funktioniert nicht in einer Recycler-Ansicht. Wenn Sie einen Recycler verwenden, verwenden Sie View.addOnLayoutChangeListener:

Ich habe festgestellt, dass die Ellipsisierung, die ich für textView in xml definierte, nicht immer reflektiert wurde. Daher habe ich sie programmgesteuert festgelegt, bevor ich die Texteigenschaft neu zugewiesen habe. Das hat bei mir funktioniert.

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

Wenn Sie dieses Problem haben und Ihre TextView sich in einer RelativeLayout befindet, wechseln Sie die RelativeLayout für eine LinearLayout.

Das hat das Problem für mich behoben

2
JesperB

Ich denke, es gibt sehr wenig, was Sie tun können, um dies durch Ändern der Layouts zu erreichen. Da habe ich festgestellt, dass einige Methoden nur in einigen Fällen funktionieren. Ich denke, es hängt von der gesamten Layout-Hierarchie ab und ist keine einheitliche Lösung. Mir ist auch aufgefallen, dass dies besonders dann der Fall ist, wenn Sie eine andere Schriftart haben, die Sie auf TextView setzen möchten. 

Eine sichere Methode, die ich getestet und getestet habe, besteht darin, dass Sie die Schriftattribute im Code festlegen können, nachdem die Ansicht aufgeblasen wurde. Ich gehe davon aus, dass Sie eine Schriftart im Ordner Assets/Fonts haben, die Sie möchten. 

Für zB in einem 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
}

Und in einer Aktivität:

@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

Ich habe das gleiche Problem und es ist sehr ärgerlich. 

Das passiert nur bei arabischem Text. 

Wenn Sie die Beschriftung mehrzeilig gestalten und am Ende Ihrer Zeichenfolge einen \n hinzufügen, wird dies behoben. Das Problem besteht jedoch darin, dass zwischen dieser Beschriftung und dem darunter liegenden Objekt eine große Lücke besteht, da dies der Fall ist Feld hat jetzt eine neue leere Zeile darunter.

Um dies zu umgehen, kann eine benutzerdefinierte Steuerung vorgenommen werden. Aber insgesamt ist dies ein nerviger Fehler. 

1
Adel Ammari

Am besten umgehen Sie dies, indem Sie am unteren Rand Ihrer Ansicht eine Dummy-Ansicht der gewünschten Höhe hinzufügen (d. H. Die Auffüllung wird hinzugefügt).

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

Wie in meinem Fall habe ich am unteren Rand der Ansicht eine weitere Tabellenzeile hinzugefügt. Hoffe das könnte jemandem helfen.

0
Anuj Sharma

Ich weiß, dass es so spät ist, aber das ist Arbeit wie ein Zauber für mich. Fügen Sie diesen Code zu Ihrer textview hinzu.

Android:ellipsize="Marquee"
Android:layout_weight="1"
0
dewy

Fügen Sie am unteren Rand der Textansicht einen Abstand ein:

Android:paddingBottom="24dp"
0
Phil