Android:截取了textview的最后一行


113

我有一个水平面LinearLayout,在TextViewSpinner旁边有一个。这LinearLayout是在LinearLayout包含在内的固定垂直方向上多次动态膨胀的RelativeLayout

问题在于,由于我从切换Theme.lightTheme.holo.light,最后一行TextView被切成两半。当动态文本很长并且跨越多行时,会发生这种情况。

在此处输入图片说明

我已经能够通过将底部填充添加到LinearLayout包含TextView和的水平位置来解决此问题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">

    <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的线性布局中被动态放大:

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

尝试删除android:paddingBottom =“ 20dp”
Dheeresh Singh 2012年

2
尝试在textview上填充,线性布局边距也可能会
起到帮助作用

当水平使用LinearLayout时,确实存在问题。而是使用ConstraintLayout。看到。stackoverflow.com/a/48677954/630668
Dharmendra

Answers:


55

我遇到了与截图所示相同的中断问题。这是由水平方向上的基线对齐引起的LinearLayoutTextView并且Spinner由于字体大小的差异而具有不同的基准。要解决此问题,需要通过设置以下内容来禁用布局的基线对齐:

android:baselineAligned="false"

或在代码中:

layout.setBaselineAligned(false);

2
我希望我可以投票一百次!在过去的几天里,我在这个问题上浪费了很多时间,而您的答案就是我的解决方案!我很久没意识到发生了什么,因为很难在Android上调试视图层次结构。非常感谢!!!
mbm29414

除了Rynardt的答案之外,这是我的问题的解决方案。谢谢!
詹姆斯·多布森

1
这是正确的答案,它指出了发生错误的原因。谢谢。
Hoang Nguyen Huu

对于这样的情况,这是一个巨大的技巧。一点也不差。谢谢!
sunlover3

260

在尝试了一百万种不同的方法之后,我认为我已经找到了答案。

我将一个应用于LayoutGravityTextView项目:

android:layout_gravity="fill"

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


12
完美,tnx,+ 1;请注意,许多layout_gravity值会有所帮助,例如。center_vertical
Grzegorz Dev

2
如果这不起作用,则应添加填充值“ 1sp”。我创建了一个扩展样式,@android:style/Widget.TextView并添加了以下几行:<item name="android:gravity">fill</item> <item name="android:padding">1sp</item>
Graeme 2013年

为什么仅阿拉伯文本会出现此问题?
Menna-Allah Sami 2015年

12
那只是一个解决方法。正确的解决方案是将android:baselineAligned="false"您的LinearLayout
tomrozb

1
尽管这似乎可行,但正确的解决方案是来自tomrozb上面的评论中的一种,或者是Jusid的答案
Eduard B.

28

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

android:includeFontPadding="false"

最后一行文本的后代不再被剪切。


1
使用自定义字体,这可能是完美的解决方案。这是使用Droid Sans Japanese时唯一对我有用的解决方案。
Computingfreak

11

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

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

我尝试了所有其他解决方案,但这是唯一对我有用的解决方案


这就是您所说的“ chepi”
Zulqurnain Jutt 19'J31.19

6

将有问题的textview放在框架布局中。我认为由于兄弟视图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>

1
我也CheckBox一样LinearLayout。这解决了问题。
Chintan Shah

像@ChintanShah这样的CheckBox情况像魅力一样工作
ignacardel

5

发生这种情况时,您应确保 TextView大小不会超过容器的大小-

如果将a TextView设置为,wrap_content并且它的容器(或祖先容器)没有留出空间,可以将TextView其长大。

如果不是的话,它也可以在onMeasure()TextView有时不能正确测量的字母,非拉丁字符或文本是斜体效果的尾巴。您可以通过设置全局样式来对此进行更正,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特定值。


5

我的解决方案接近公认的解决方案,但是我不得不将其更改为

   android:layout_gravity="fill_vertical"

代替。否则,其他行也将被拉伸,并在随机位置添加换行符。例如,最大的一行有4行,因此另一行从

this is a testphrase

thi
s is
a testph
rase

1
为我工作。谢谢!+1
艾哈迈德

5

通过扩展TextView并添加如下自定义类,我找到了一个不同的解决方案:

 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上指定了layout_margin,则要小心,因为它可能会改变拟合线的数量,使其短于应有的数量!我改用填充代替边距,并解决了问题
MobileMon

1
这绝对完美。到目前为止,我找到了最好的解决方案。
Moonbloom

1
这是正确的答案,谢谢!为了使它更好一点,在文本被截断之前在其末尾添加“ ...”,然后this.setEllipsize(TextUtils.TruncateAt.END);在上面的if语句中添加,并android:ellipsize="end"从XML中删除(由于某种原因会破坏它)。
NeilS'7

4

尝试删除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" >

1
那里的填充实际上不相关,因为在此相对布局中包含与填充相关的其他项目。我删除了它们,以便于阅读这篇文章。请参阅有问题的编辑。
Rynardt 2012年

4

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

我发现我textView在xml中定义的省略号并不总是反映出来的,因此我在重新分配text属性之前以编程方式对其进行了设置。这对我有用。

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

如果您有此问题并且TextView在a内RelativeLayout,请尝试将换RelativeLayout为a LinearLayout

那为我解决了问题


这是唯一对我有效的解决方案(奇怪的行为)!Thx
mrroboaat 2014年

1
您如何简单地从RelativeLayout“切换”到LinearLayout?如果必须相对布局,则使用LinearLayout几乎不可能实现。
令人难以置信的

3

您可以在任何类型的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);
        }

    }
});

您可以在此处了解更多信息


1

我认为您几乎无法通过更改布局来完成此工作。正如我发现的那样,某些方法仅在某些情况下有效。我认为这取决于整个布局层次结构,而不是一刀切的解决方案。我还注意到它会发生,特别是当您要设置TextView的字体不同时。

我已经尝试过并测试过的可靠方法是,在视图放大后,可以在代码中设置字体属性。我假设您在资产/字体文件夹中拥有想要的字体。

例如在片段中:

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

1

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

它仅在阿拉伯文本中发生。

如果使标签多行并\n在字符串的末尾添加a ,将可以解决该问题,但是问题在于,由于该字段现在下面有一个新的空行。

可以执行自定义控件来解决此问题。但是总的来说,这是一个令人讨厌的错误。


如果您有新问题,请单击“ 提问”按钮提问。如果您有足够的声誉,则可以反对该问题。或者,将其“收藏”为收藏,您将收到任何新答案的通知。
马丁·皮特斯

0

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

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

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


0

我知道已经很晚了,但这对我来说就像是魅​​力。将此代码添加到您的textview

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

0

在文本视图的底部添加填充:

android:paddingBottom="24dp"

-1

我终于解决了!

我尝试将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的更新尚未准备好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.