TextView填充动态切断最后一行文本

时间:2011-11-15 23:27:11

标签: android textview

我不确定它只是“最后一行”,但我们有一个带有fill_parent宽度,wrap_content高度的TextView的应用程序。文本正在从Java代码中动态放入。即使布局中有足够的空间,文本的最后一行也没有显示出来。它在一个相当深的视图层次结构内部,所以我的猜测是它的测量逻辑变得混乱,但它非常令人沮丧。我们需要猜测文本中会有多少行,并相应地设置'android:lines'以使其工作。

有人见过这个吗?在代码中,请参见底部的id'contentTextView'。如果我拿出'android:lines',最后一行文字就会消失。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/flag"
        >

    <include android:id="@+id/incHeader" layout="@layout/header"/>

    <FrameLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1">

        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical">

            <ImageView
                    android:layout_width="fill_parent"
                    android:layout_height="101dp"
                    android:background="@drawable/headershadow"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:visibility="invisible"
                    android:layout_weight="1"/>


            <ImageView
                    android:layout_width="fill_parent"
                    android:layout_height="101dp"
                    android:background="@drawable/footershadow"/>

        </LinearLayout>

        <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/gybcontentback"
                android:layout_gravity="center_horizontal"
                android:orientation="vertical">

            <include android:id="@+id/gybHeaderInclude" layout="@layout/gybcontentheader"/>


                <TextView
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:textColor="#4f4f4f"
                        android:paddingLeft="15dp"
                        android:paddingRight="15dp"
                        android:lines="9"
                        android:id="@+id/contentTextView"/>

            <ImageView
                    android:layout_marginTop="15dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/button_blue_rascal_button"
                    android:id="@+id/buttonMoreInfo"/>

        </LinearLayout>

    </FrameLayout>


    <include android:id="@+id/incFooter" layout="@layout/menu"/>

</LinearLayout>

Java代码。我在onCreate期间使用标准Java字符串填充TextView。

@Override
protected String body()
{
    return "Rascal Flatts and The Jason Foundation, Inc. are working together to prevent suicide.\n\n" +
            "Your Battle Buddy (or family member) may need a friend.\n\n" +
            "Take the pledge to B1.";
}

基类调用它来获取实际文本

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(contentView());
    wireMenu();

    TextView headerText = (TextView) findViewById(R.id.gybHeaderText);
    if(headerText != null)
        headerText.setText(header());

    ((TextView) findViewById(R.id.contentTextView)).setText(body()); // This is where the text is set
}

无论如何,我把它煮熟了。我正在切割零件以查看剩下的内容并仍然遇到同样的问题。我想我可能找到了触发器和解决方案,但不是“原因”。

7 个答案:

答案 0 :(得分:7)

我有同样的问题。我找到了一个解决方法。 在文本中添加新行“\ n”。这将始终显示您的所有文字。

答案 1 :(得分:2)

您是否尝试使用LinearLayout直接包围TextView,并将width和height设置为wrap_content?

它对我有用......

答案 2 :(得分:1)

我将布局简化为基础部分。这是剥离版本,仍在关闭文本:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/flag"
        >


    <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:orientation="vertical">

            <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#4f4f4f"
                    android:id="@+id/contentTextView"/>

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/button_blue_rascal_button"
                    android:id="@+id/buttonMoreInfo"/>

        </LinearLayout>



</LinearLayout>

我认为,问题是父线性LinearLayout从其内部的ImageView获取其宽度。在此混合的某处,TextView获取其请求高度的值不正确。我想这与UI的计算方式有关。家长必须要求孩子们要求的宽度,然后回去告诉每个人他们的宽度是多少,然后要求高度。这样的事情。无论如何,以下工作。图像宽度为263像素(以mdpi为单位),因此如果我在父布局上设置263dp而不是wrap_content,则一切正常。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/flag"
        >


    <LinearLayout
                android:layout_width="263dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:orientation="vertical">

            <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#4f4f4f"
                    android:id="@+id/contentTextView"/>

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/button_blue_rascal_button"
                    android:id="@+id/buttonMoreInfo"/>

        </LinearLayout>



</LinearLayout>

将TextView设置为wrap_content也可以,但它会将整个布局推得比我想要的大。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/flag"
        >


    <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:orientation="vertical">

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="#4f4f4f"
                    android:id="@+id/contentTextView"/>

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/button_blue_rascal_button"
                    android:id="@+id/buttonMoreInfo"/>

        </LinearLayout>



</LinearLayout>

不确定这里的内容是什么。总结一下,如果你开始看到计算出的高度问题,可以考虑在那里修复父级的宽度,这样就不会混淆UI计算。

答案 3 :(得分:1)

我有一个不同的问题,但同样相关。这是我认为适用于您所需要的解决方案。您可以在任何类型的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);
        }

    }
});

您可以阅读更多相关信息here

答案 4 :(得分:0)

你试过吗

android:singleLine="false" 

答案 5 :(得分:0)

尝试添加

  

android:padding

你在TextView中的

。为我工作

答案 6 :(得分:0)

将有问题的TextView放在FrameLayout(或某个容器)中。我认为问题是因为你的兄弟姐妹观点。