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.
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>
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.
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);
Ich hatte das gleiche Problem und stellte fest, dass es einfach hinzugefügt wurde
Android:includeFontPadding="false"
die letzten Textzeilen wurden nicht mehr abgeschnitten.
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
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.
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>
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);
}
}
}
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" >
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
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
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());
}
}
});
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
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
}
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.
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.
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"
Fügen Sie am unteren Rand der Textansicht einen Abstand ein:
Android:paddingBottom="24dp"