简体   繁体   中英

TextView not wrapping on Android 2.1 Eclair

I am having a problem with a TextView containing a lot of text. On Android 2.1update1 (Eclair) the text isn't wrapping but on Android 2.2 (Froyo) it is. This is happening on the emulators as well as a couple test devices that I've tried. Sample code and screenshots below.

LongtextActivity.java:

package com.example.longtext;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ScrollView;
import android.widget.TextView;

public class LongtextActivity extends Activity {
    private static final String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eleifend sodales vulputate. Aenean quis mattis tellus. Morbi fringilla sagittis turpis, scelerisque tempus velit molestie a. Suspendisse ut lectus nec nibh posuere commodo. Aliquam id purus eros. Quisque condimentum enim vitae odio ultricies posuere. Integer at lectus dolor. Etiam ultricies posuere neque, ut sagittis tellus tempus et. Aliquam vitae diam augue, vel vehicula tellus. Nullam dignissim magna luctus odio commodo cursus. Aenean magna justo, interdum in ultricies vitae, tincidunt at risus. Vivamus elit magna, sagittis a egestas non, suscipit a mi. Nam blandit, mauris nec adipiscing egestas, neque risus vestibulum lacus, eu iaculis lacus dui id sapien. Cras vitae nunc felis, sit amet fermentum est. Suspendisse dui ligula, sodales nec varius eget, cursus et urna. Ut eget turpis non lorem rutrum interdum. Morbi bibendum convallis adipiscing. Nam commodo, lectus lobortis feugiat ullamcorper, dui mi tincidunt tellus, a consectetur quam odio eget urna. Fusce adipiscing congue ipsum et luctus. Quisque nisi eros, porttitor nec tempor non, ultrices eget mi. Sed ac magna sit amet nulla facilisis porttitor non eget odio. Cras blandit tempus urna, quis molestie ante bibendum sit amet. Proin id cursus leo. Aenean malesuada bibendum turpis, in vehicula purus gravida sed. Suspendisse potenti. Curabitur dapibus, eros ut dapibus mattis, turpis nibh convallis nulla, et commodo nibh eros eu diam. Nunc nisl sem, rhoncus eget lobortis a, fringilla vel lorem. Curabitur vitae massa et est rhoncus dictum sit amet nec nisl. Maecenas id orci leo. Curabitur id auctor sapien. Praesent ac malesuada nunc. In leo libero, sollicitudin sed feugiat sit amet, feugiat non augue. Donec faucibus, augue vel rutrum scelerisque, sem erat posuere libero, vitae accumsan turpis justo vitae felis. Suspendisse bibendum auctor eros non semper. Sed in porta ipsum. Fusce ipsum mauris, porta eu sodales laoreet, suscipit ac urna. Etiam quam nunc, vestibulum a tempor dignissim, accumsan consequat lorem. Vivamus sed massa tortor. Curabitur odio ante, semper vitae sollicitudin eu, accumsan non sapien. Donec malesuada leo quis neque interdum at tristique nibh consequat. Suspendisse tincidunt dapibus elit et tincidunt. Sed ut massa eu ipsum imperdiet scelerisque dictum id ante. Duis iaculis congue purus, eu dictum risus varius ac. Pellentesque leo arcu, iaculis in eleifend in, elementum mollis augue. Donec vitae mi justo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce ut nisi est, ut tempor ante. Donec nisi nisl, accumsan sed pellentesque et, pellentesque at ipsum. Ut in nibh ipsum. Morbi orci nisi, tempor eu accumsan ac, vehicula consectetur dui. Aenean accumsan leo vitae enim posuere vel commodo neque adipiscing. Sed felis odio, tempor quis convallis a, lacinia non metus. Maecenas euismod egestas arcu, sed luctus felis tincidunt eu. In mollis accumsan tellus venenatis dignissim. Quisque ultrices malesuada quam, at luctus est lobortis sed. Etiam aliquam est euismod mauris feugiat nec cursus sem ornare. Etiam molestie luctus dolor, nec laoreet lacus lacinia id. Fusce posuere aliquet orci quis tincidunt. Nunc fermentum tincidunt sollicitudin. Pellentesque et lacinia massa. Mauris id elit nisi. Donec et luctus nulla. Mauris pretium, ante sed porta ultrices, metus metus interdum risus, nec mollis quam elit et neque. Nulla sed sem sapien, eget feugiat nibh. Pellentesque ornare mollis dui, a porta turpis facilisis vel. Ut consequat interdum venenatis. Integer ac fermentum sapien. Fusce quis nulla eu leo pellentesque ornare ut a orci. Morbi id nibh sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Morbi faucibus rhoncus sodales. Vivamus elit urna, ultricies ac dapibus non, congue quis arcu. Cras condimentum ipsum et nisl pellentesque eu cursus justo congue. Quisque vitae lacus ac sapien imperdiet ullamcorper. Duis ac est et felis pulvinar consequat porttitor ut massa. Nunc porttitor pharetra orci, non aliquam magna aliquam sit amet. Etiam non enim ut justo blandit congue et a nibh. Maecenas ac lorem at justo tempus vehicula at nec risus. Etiam venenatis semper lectus vel faucibus. Fusce nec sem at libero euismod laoreet quis vel dui.";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView bodyField = new TextView(this);
        // bodyField.setHorizontallyScrolling(false); No effect
        bodyField.setText(LONG_TEXT);

        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.addView(bodyField, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        ScrollView scrollView = new ScrollView(this);
        scrollView.setFillViewport(true);
        scrollView.addView(layout, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

        setContentView(scrollView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    }
}

Screenshots:

Eclair:

2.1模拟器截图

Froyo:

2.2模拟器截图

Any ideas how I can make this work on Eclair? I need to support Eclair and up for my application. Thanks in advance!

UPDATE

I usually do programmatic UI generation because of the extreme run-time customization required of my real application, but by request here's an XML version that exhibits the same behavior. Again I tried it with and without the scrollHorizontally="false" attribute with no difference.

longtext.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
        <TextView
            android:id="@android:id/text1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scrollHorizontally="false" />
    </LinearLayout>
</ScrollView>

LongtextActivity.java:

package com.example.longtext;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ScrollView;
import android.widget.TextView;

public class LongtextActivity extends Activity {
    private static final String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eleifend sodales vulputate. Aenean quis mattis tellus. Morbi fringilla sagittis turpis, scelerisque tempus velit molestie a. Suspendisse ut lectus nec nibh posuere commodo. Aliquam id purus eros. Quisque condimentum enim vitae odio ultricies posuere. Integer at lectus dolor. Etiam ultricies posuere neque, ut sagittis tellus tempus et. Aliquam vitae diam augue, vel vehicula tellus. Nullam dignissim magna luctus odio commodo cursus. Aenean magna justo, interdum in ultricies vitae, tincidunt at risus. Vivamus elit magna, sagittis a egestas non, suscipit a mi. Nam blandit, mauris nec adipiscing egestas, neque risus vestibulum lacus, eu iaculis lacus dui id sapien. Cras vitae nunc felis, sit amet fermentum est. Suspendisse dui ligula, sodales nec varius eget, cursus et urna. Ut eget turpis non lorem rutrum interdum. Morbi bibendum convallis adipiscing. Nam commodo, lectus lobortis feugiat ullamcorper, dui mi tincidunt tellus, a consectetur quam odio eget urna. Fusce adipiscing congue ipsum et luctus. Quisque nisi eros, porttitor nec tempor non, ultrices eget mi. Sed ac magna sit amet nulla facilisis porttitor non eget odio. Cras blandit tempus urna, quis molestie ante bibendum sit amet. Proin id cursus leo. Aenean malesuada bibendum turpis, in vehicula purus gravida sed. Suspendisse potenti. Curabitur dapibus, eros ut dapibus mattis, turpis nibh convallis nulla, et commodo nibh eros eu diam. Nunc nisl sem, rhoncus eget lobortis a, fringilla vel lorem. Curabitur vitae massa et est rhoncus dictum sit amet nec nisl. Maecenas id orci leo. Curabitur id auctor sapien. Praesent ac malesuada nunc. In leo libero, sollicitudin sed feugiat sit amet, feugiat non augue. Donec faucibus, augue vel rutrum scelerisque, sem erat posuere libero, vitae accumsan turpis justo vitae felis. Suspendisse bibendum auctor eros non semper. Sed in porta ipsum. Fusce ipsum mauris, porta eu sodales laoreet, suscipit ac urna. Etiam quam nunc, vestibulum a tempor dignissim, accumsan consequat lorem. Vivamus sed massa tortor. Curabitur odio ante, semper vitae sollicitudin eu, accumsan non sapien. Donec malesuada leo quis neque interdum at tristique nibh consequat. Suspendisse tincidunt dapibus elit et tincidunt. Sed ut massa eu ipsum imperdiet scelerisque dictum id ante. Duis iaculis congue purus, eu dictum risus varius ac. Pellentesque leo arcu, iaculis in eleifend in, elementum mollis augue. Donec vitae mi justo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce ut nisi est, ut tempor ante. Donec nisi nisl, accumsan sed pellentesque et, pellentesque at ipsum. Ut in nibh ipsum. Morbi orci nisi, tempor eu accumsan ac, vehicula consectetur dui. Aenean accumsan leo vitae enim posuere vel commodo neque adipiscing. Sed felis odio, tempor quis convallis a, lacinia non metus. Maecenas euismod egestas arcu, sed luctus felis tincidunt eu. In mollis accumsan tellus venenatis dignissim. Quisque ultrices malesuada quam, at luctus est lobortis sed. Etiam aliquam est euismod mauris feugiat nec cursus sem ornare. Etiam molestie luctus dolor, nec laoreet lacus lacinia id. Fusce posuere aliquet orci quis tincidunt. Nunc fermentum tincidunt sollicitudin. Pellentesque et lacinia massa. Mauris id elit nisi. Donec et luctus nulla. Mauris pretium, ante sed porta ultrices, metus metus interdum risus, nec mollis quam elit et neque. Nulla sed sem sapien, eget feugiat nibh. Pellentesque ornare mollis dui, a porta turpis facilisis vel. Ut consequat interdum venenatis. Integer ac fermentum sapien. Fusce quis nulla eu leo pellentesque ornare ut a orci. Morbi id nibh sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Morbi faucibus rhoncus sodales. Vivamus elit urna, ultricies ac dapibus non, congue quis arcu. Cras condimentum ipsum et nisl pellentesque eu cursus justo congue. Quisque vitae lacus ac sapien imperdiet ullamcorper. Duis ac est et felis pulvinar consequat porttitor ut massa. Nunc porttitor pharetra orci, non aliquam magna aliquam sit amet. Etiam non enim ut justo blandit congue et a nibh. Maecenas ac lorem at justo tempus vehicula at nec risus. Etiam venenatis semper lectus vel faucibus. Fusce nec sem at libero euismod laoreet quis vel dui.";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.longtext);
        TextView tv = (TextView) findViewById(android.R.id.text1);
        tv.setText(LONG_TEXT);
    }
}

I had similar behavior on an app but only when it ran specifically in Android 2.1_update1. Android 1.5, 1.6, 2.2, and 2.3.3 didn't exhibit the issue.

Something must have been set differently in 2.1_u1 because just using the defaults no longer worked. I had to explicitly set the attributes. To fix it I set the following properies:

android:singleLine="false"
android:inputType="textMultiLine"
android:scrollHorizontally="false"

Apparently singleLine defaults to false, but the inputType attribute is specified at all, singleLine defaults to true. I also set scrollHorizontally to false more to catch corner cases I didnt test, since adding it solved the issue for others.

I had a side effect after setting the properties which made my text dim when scrolling, so I added the following two attributes to remove that behavior, as well:

android:clickable="false"
android:longClickable="false"

This answer might help.

you must set android:scrollHorizontally="false" in your xml.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM