122

我有一个LinearLayout包含 a的水平,TextView然后是Spinner它旁边的 a。这LinearLayoutLinearLayout包含在RelativeLayout.

问题是,自从我从 切换Theme.light到 后Theme.holo.light,最后一行TextView被减半。当动态文本很长并且跨越多行时会发生这种情况。

在此处输入图像描述

我已经能够通过将底部填充添加到LinearLayout包含TextViewand的水平线来解决这个问题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>
4

21 回答 21

268

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

我将 a 应用于LayoutGravityTextView 项目:

android:layout_gravity="fill"

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

于 2012-06-28T13:56:36.573 回答
67

我遇到了与屏幕截图所示相同的截止问题。它是由水平方向的基线对齐引起的LinearLayoutTextView并且Spinner由于字体大小不同而具有不同的基线。要解决此问题,需要通过设置禁用布局的基线对齐:

android:baselineAligned="false"

或在代码中:

layout.setBaselineAligned(false);
于 2014-06-25T10:36:23.340 回答
34

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

android:includeFontPadding="false"

最后一行文本不再被裁剪。

于 2015-05-27T17:56:49.507 回答
11

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

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

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

于 2014-10-22T09:33:39.237 回答
7

我通过扩展 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);
        }
    }

}
于 2014-11-18T16:10:14.720 回答
6

将有问题的文本视图放在框架布局中。我认为文本视图的计算不正确是因为同级视图 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>
于 2017-08-28T17:53:02.280 回答
5

发生这种情况时,您应该确保它TextView不会比它的容器大 -

如果 aTextView设置为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 特定值。

于 2013-12-04T11:39:11.260 回答
5

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

   android:layout_gravity="fill_vertical"

反而。否则,其他行也会被拉伸,并在随机位置添加换行符。例如,最大的一行有 4 行,所以另一行从

this is a testphrase

thi
s is
a testph
rase
于 2016-02-11T07:56:13.177 回答
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" >
于 2012-06-28T11:49:28.643 回答
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());
            }
        }
    });
于 2017-05-19T12:09:27.417 回答
3

如果您遇到此问题并且您TextView在 aRelativeLayout中,请尝试切换RelativeLayoutfor a LinearLayout

这为我解决了问题

于 2012-11-08T12:22:45.487 回答
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);
        }

    }
});

你可以在这里阅读更多关于它的信息

于 2016-03-14T03:22:26.520 回答
2

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

android:ellipsize="marquee"
android:layout_weight="1"
于 2017-08-18T09:44:58.307 回答
1

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

它只发生在阿拉伯语文本中。

如果您将标签设置为多行并\n在字符串的末尾添加 a ,它会修复它,但问题是这个标签与其下面的对象之间会有很大的差距,因为这个字段现在它下面有一个新的空行。

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

于 2012-11-06T10:53:41.307 回答
1

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

我实验和测试过的一个确定的方法是,您可以在视图膨胀后在代码中设置字体属性。我假设您在 assets/fonts 文件夹中有您想要的字体。

例如在片段中:

@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
}
于 2016-05-02T12:07:49.567 回答
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>

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

于 2014-08-18T07:24:18.380 回答
0

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

android:paddingBottom="24dp"
于 2019-08-27T23:54:16.010 回答
0

我遇到了同样的问题,并找到了一个方便的解决方案。我在渲染后得到TextView的行数,并根据行数设置高度。这是代码。

TextView textView = (TextView) layout.findViewById(R.id.textView);
textView.setText(this.text);
textView.post(new Runnable() {
    @Override
    public void run() {
        int linesCount = textView.getLineCount();
        textView.setLines(linesCount);
    }
});
于 2020-09-17T08:08:37.587 回答
0

对我来说,这个解决方案就像一个魅力。

我的最外层布局的高度和宽度是动态设置的,因此即使我在我的 xml 中设置了 android:maxLines (对于不同的设备,它的行为不同),其中包含的 TextView 也得到了它的文本剪切。

在尝试了不同的方法后,我终于得到了解决我的问题的解决方案。

文本视图:

public class CustomTextView extends androidx.appcompat.widget.AppCompatTextView {
    public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public CustomTextView(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);
            this.setEllipsize(TextUtils.TruncateAt.END);
        }
    }
}

xml:

<com.myproject.android.customviews.CustomTextView
    android:id="@+id/tv_partner_description"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="top"
    android:textColor="@color/white"
    android:textSize="@dimen/text_small_medium" />
于 2020-10-27T17:56:16.300 回答
0

为特定语言创建主题,如样式-ar,它切断了文本视图:

<style name="EnnodaCustomTextView" parent="Widget.AppCompat.TextView">
        <item name="android:paddingTop">1dp</item>
        <item name="android:paddingBottom">1dp</item>
</style>

将它应用到您的 AppTheme 以反映整个应用程序以填充底部,如:

    <item name="android:textViewStyle">@style/EnnodaCustomTextView</item>

注意:在默认styles.xml中创建相同的样式名称,没有用于填充的项目标签..(不需要额外的填充)

于 2021-02-06T11:20:38.947 回答
-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 的更新还没有准备好。

于 2015-10-01T03:31:06.673 回答