Android:切断了最后一行的textview

我有一个水平的LinearLayout包含一个TextView紧接着旁边的Spinner 。 这个LinearLayoutRelativeLayout包含的固定垂直LinearLayout中被dynamic地多次膨胀。

问题是,因为我从Theme.light切换到Theme.holo.lightTextView的最后一行被切成两半。 当dynamic文本很长并跨越多行时,会发生这种情况。

在这里输入图像说明

我已经能够通过添加底部填充到包含TextViewSpinner的水平LinearLayout来解决这个问题。

这不是一个修复,但更多的是一个黑客。 有人可以请给我一些build议,如何妥善解决这个问题?

我也读了一些其他的问题,但似乎没有任何帮助。

水平线性布局:

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

相对布局,其中上面的布局在ID为ll2_7的线性布局中dynamic膨胀:

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

编辑:这是上面的完整的布局xml:

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

在尝试了一百万种不同的东西之后,我想我有了答案。

我将一个LayoutGravity应用于TextView项目:

 android:layout_gravity="fill" 

似乎解决了我所有的裁剪问题。 希望这可以帮助有同样问题的人。

我遇到了屏幕截图中显示的相同的截断问题。 这是由水平LinearLayout的基线alignment造成的。 由于字体大小不同, TextViewSpinner具有不同的基线。 要解决这个问题,需要通过设置来禁用布局的基线alignment:

 android:baselineAligned="false" 

或者在代码中:

 layout.setBaselineAligned(false); 

我有同样的问题,并发现只需添加

 android:includeFontPadding="false" 

文本的最后一行不再有下行剪辑。

我通过添加文本后添加了一些虚拟空间

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

我尝试了所有其他解决scheme,但这是唯一解决scheme

发生这种情况时,应该确保TextView不会比容器大 –

如果一个TextView被设置为wrap_content并且它的容器(或者一个祖先容器)没有留下空间让TextView进入,它可以被遮挡。

如果情况并非如此,那么TextViewonMeasure()有时也可能不能正确地测量字母,非拉丁字符或来自斜体文本的效果的尾部。 你可以通过为你的TextView设置一个全局样式来纠正这个问题,所以它会被拾取而不需要改变你的整个代码库:

确保你是应用程序/活动使用自定义主题,如下所示:

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

@Rynadt的回答对于达到上述阶段非常有帮助。 在视图内部设置文本的重力可以确保在某些设备上永远不会发生遮挡(文本在视图中正确安装),而在其他设备上可以帮助填充sp值,从而确保尾部等与一个TextSize特定的值。

尝试删除android:paddingBottom =“20dp”

  <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="20dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="10dp" > 

我的解决scheme接近接受的解决scheme,但我不得不改变它

  android:layout_gravity="fill_vertical" 

代替。 否则,其他行将会随机扩展,并随机添加换行符。 例如,最大的一行有4行,所以又换了一行

this is a testphrase

 thi s is a testph rase 

我通过扩展TextView和添加一个自定义类来find一个不同的解决scheme:

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

如果你有这个问题,你的TextView是在一个RelativeLayout里面,请尝试为一个LinearLayout切换RelativeLayout

这为我解决了这个问题

您可以在任何types的ViewGroup中使用TextView的全局布局侦听器。

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

你可以在这里阅读更多

我认为你可以通过改变布局来做到这一点。 我发现有些方法只在某些情况下才起作用。 我认为这取决于整个布局的层次结构,而不是一个通用的解决scheme。 我也注意到,特别是当你想要设置为TextView的字体不同时。

我已经试验和testing的一个可靠的拍摄方法是,您可以在视图充满后在代码中设置字体属性。 我假设你有你想要的资产/字体文件夹中的字体。

例如在片段中:

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

在一个活动中:

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

最好的解决方法是在视图的底部添加一个所需高度的虚拟视图(即,这将添加填充本身)。

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

就像我的情况一样,我在视图的底部添加了一个表格行。 希望这可以帮助别人。

我终于修好了!

我尝试将String添加到Service中的TextView ,然后调用scrollTo(),最后一行被截断!

scrollTo()应该在“Runnable”中调用,如:

 private ScrollView mScrollView; public void scrollToBottom() { mScrollView = (ScrollView) findViewById(R.id.debug_textview_scrollview); mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } }); } 

我认为这是因为在服务调用scrollTo()方法中,TextView的更新没有准备好。

我也有同样的问题,而且非常烦人。

它只发生在阿拉伯文本。

如果你使用多行标签并在string末尾添加一个\n ,它会修复它,但问题是这个标签和它下面的对象之间会有很大差距,因为这个字段现在在它下面有一个新的空行。

自定义控件可以做到解决这个问题。 但总的来说,这是一个恼人的错误。

getViewTreeObserver().addOnGlobalLayoutListener在回收视图中不起作用。 如果您使用的是回收站,请使用View.addOnLayoutChangeListener

我发现我定义的XML的textView椭圆不总是反映,所以我编程设置它之前重新分配文本属性。 这对我有效。

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

我知道这么晚了,但是这对我来说就像魅力一样。 将此代码添加到您的textview

 android:ellipsize="marquee" android:layout_weight="1" 

把有问题的textview放在一个framelayout里面。 我认为文本视图不能正确计算,因为兄弟姐妹视图,微调。

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