Intereting Posts
Android, изменение подчеркивания Цвет из EditText динамически Как установить .apk-файлы в эмулятор Android? Android Host Host API: объем буфера переноса Как получить серийный номер из Android Mobile Browser с использованием Java Scripting, который будет из источника веб-приложений, запущенного в мобильном браузере Запросы СМИ не ведут себя так, как ожидалось на Android Android Google Maps v2, MAP_TYPE_NONE и черные квадраты В какой операционной системе работает Eclipse? Эмулятор: ERROR: эмуляция x86 в настоящее время требует аппаратного ускорения Не удалось отправить смс с помощью SMSManager в Android Во время звонка можно получить длительность исходящего звонка? Установить ширину динамического текста Предотвращение уведомления. Ожидается запуск PendingIntent. Активность уже запущена? Две службы с одним и тем же фильтром намерений Android: использование PopupMenu в API уровня 9 Ошибка раздувания фрагмента класса

Принудительное следующее слово к новой строке, если слово слишком длинное для текстового поля

У меня есть TextView , который при заполнении программным способом не будет правильно разрывать слова.

Токовый выход:

Это то, что происходит:

 | Hi I am an examp | | le of a string t | | hat is not break | | ing correctly on | | words | 

Ожидаемый результат:

Я хочу это:

 | Hi I am an | | example of a | | string that is | | breaking | | correctly on | | words | 

Ява:

 String mQuestion = "Hi I am an example of a string that is breaking correctly on words"; mTextView.setText(mQuestion); 

XML:

 <LinearLayout android:id="@+id/questionContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/questionHeaderTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/header_bg" android:paddingBottom="10dp" android:paddingLeft="25dp" android:paddingTop="10dp" android:text="@string/category_hint" android:textAppearance="?android:attr/textAppearanceLarge" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Space android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight=".05" /> <!-- THIS ONE WILL NOT WRAP !--> <TextView android:id="@+id/questionHolderTextView" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".9" android:layout_marginBottom="15dp" android:layout_marginTop="15dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:text="@string/question_holder" android:singleLine="false" android:scrollHorizontally="false" android:ellipsize="none" android:textSize="20sp" /> <Space android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight=".05" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_marginTop="5dp" android:background="@color/black" /> </LinearLayout> <LinearLayout android:id="@+id/answerContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:visibility="visible" > </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="25dp" android:gravity="center" > <Button android:id="@+id/nextButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="25dp" android:text="@string/next" /> </LinearLayout> 

Solutions Collecting From Web of "Принудительное следующее слово к новой строке, если слово слишком длинное для текстового поля"

Сначала вы можете получить текстовую краску с помощью TextView.getPaint() , а затем каждый раз, когда вы добавляете новое слово (Hi, I, am и т. Д.), measureText на краску. Если длина результата больше, чем доступная ширина вашего TextView, добавьте \n перед новым словом. Восстановите данные и повторите шаги.

Я закончил тем, что использовал

 private void initView() { Paint paint = new Paint(); float width = paint.measureText(mQuestion); int maxLength = 300; // put whatever length you need here if (width > maxLength) { List<String> arrayList = null; String[] array = (mQuestion.split("\\s")); arrayList = Arrays.asList(array); int seventyPercent = (int) (Math.round(arrayList.size() * 0.70)); // play with this if needed String linebreak = arrayList.get(seventyPercent) + "\n"; arrayList.set(seventyPercent, linebreak); mQuestion = TextUtils.join(" ", arrayList); mQuestion.replace(",", " "); } mQuestionHolderTextView.setText(mQuestion); } 

Я измеряю строку, превращаю ее в список, а затем разделяю ее на 70% и создаю новую строку. Затем я верню список в строку и удалю запятые. Пока слово составляет не более 30% оставшейся строки, вы находитесь в ясном состоянии, в противном случае настройте соответствующим образом.

Это быстро и грязно, но это сработало для меня.

Используя следующий метод, вы можете получить обернутый текст.

Поскольку у меня нет андроида, я написал класс Test и вызвал метод из main. Вам нужно передать ширину текста. Я прошел 14 здесь.

  public class Test{ public static void main(String[] args) { String wrappedText=wrapText(14); System.out.println(wrappedText); } public static String wrapText(int textviewWidth) { String mQuestion = "Hi I am an example of a string that is breaking correctly on words"; String temp = ""; String sentence = ""; String[] array = mQuestion.split(" "); // split by space for (String word : array) { if ((temp.length() + word.length()) < textviewWidth) { // create a temp variable and check if length with new word exceeds textview width. temp += " "+word; } else { sentence += temp+"\n"; // add new line character temp = word; } } return (sentence.replaceFirst(" ", "")+temp); } } 

Вывод –

 Hi I am an example of a string that is breaking correctly on words