Intereting Posts
Прикрепление источника к внешней банке в проекте eclipse для android Parse.com datastore не закрепляет более одного несохраненного объекта Можно ли отображать виджет только для определенной версии Android? Установите статический IP и шлюз программно в Android 6.x (Marshmallow) Поддерживает ли в приложении биллинг несколько учетных записей? Как получить FusedLocation из IntentService Не удается получить доступ к микрофону, когда другое приложение использует его в Android Асинхронная загрузка растровых изображений в адаптере с акцентом на Bitmap.recycle () Может ли textview иметь буквы разных цветов? API WooCommerce для мобильного приложения Более простой способ получить идентификатор (строку) представления по его идентификатору (int) Можно ли использовать Google App Engine в качестве базы данных для приложений Android? Ошибка в файле maven pom xml: создание проекта Android Не удалось обнаружить Bluetooth -> Фрагмент добавить или заменить неработающий

Как отрегулировать высоту строки в TextView с несколькими типоразмерами?

У меня есть TextView, который содержит строку Spannable. Строка содержит кучу текста, первое слово которой в два раза меньше, чем остальные строки.

Проблема заключается в том, что расстояние между первой и второй строками намного больше, чем расстояние между линиями между последующими линиями из-за увеличенного размера первого слова.

http://img.skitch.com/20100615-fwd2aehbsgaby8s2s9psx3wwii.png

Строка spannable была создана с использованием следующего фрагмента кода:

// Price CharSequence text = "$30 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." final Pattern priceRegex = Pattern.compile("^(.[0-9]+)\\s.*"); final Matcher m = priceRegex.matcher(text!=null ? text : ""); if( m.matches() ) { text = new SpannableString(text); ((SpannableString)text).setSpan(new RelativeSizeSpan(2), 0, m.end(1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } 

Как я могу исправить свой TextView, чтобы все линии имели одинаковый интервал?

Solutions Collecting From Web of "Как отрегулировать высоту строки в TextView с несколькими типоразмерами?"

Вы можете попробовать использовать один из этих свойств TextView:

 android:lineSpacingMultiplier android:lineSpacingExtra 

По крайней мере, попытаться сделать все линии одинаковой высоты (такие же, как и первая).

После многих проб и ошибок я получил очень хакерское решение для работы:

  1. Я добавил spannables с тем же удвоенным размером текста, что и выделенное слово, для каждого пространства внутри текста. Таким образом, весь TextView получил одинаковый (большой) межстрочный интервал. Имейте в виду, что вы не можете повторно использовать spannable.

  2. Затем я дал TextView отрицательную строкуSpacingExtra, так что межстрочный интервал снова выглядел приятным.

  3. Чтобы избежать чрезмерно широких пространств из-за увеличения размера текста, я добавил ScaleXSpan в каждое пространство, масштабируя их до 50% от их первоначального большого размера.

Этот метод должен работать даже для TextViews, которые содержат локализованные строки (где вы никогда не знаете, в какой позиции отображается подчеркнутое слово или как долго будет ваша строка), если каждая строка содержит хотя бы один пробельный символ.

Я написал эту функцию:

ВХОД

  • LinearLayout ll:

    Макет, который будет вашим «TexView» (убедитесь, что его ориентация вертикальна)

  • Строковые деньги:

    Строка, в которой вы хотите быть другой (в вашем случае больше текста)

  • Строковый текст:

    текст

  • Контекст mContext

    контекст

ЧТО ДЕЛАТЬ

Я прокомментировал части, которые вы должны отредактировать


 private void populateText(LinearLayout ll, String money, String text , Context mContext) { String [] textArray = text.split(" "); Display display = getWindowManager().getDefaultDisplay(); ll.removeAllViews(); int maxWidth = display.getWidth() - 20; LinearLayout.LayoutParams params; // to be used over and over LinearLayout newLL = new LinearLayout(mContext); newLL.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); newLL.setGravity(Gravity.LEFT); newLL.setOrientation(LinearLayout.HORIZONTAL); int widthSoFar = 0; ///FIRST INSERT THE MONEY TEXTVIEW LinearLayout LL = new LinearLayout(mContext); LL.setOrientation(LinearLayout.HORIZONTAL); LL.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM); //THIS IS IMPORTANT TO keep spacing up not down LL.setLayoutParams(new ListView.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); TextView TV = new TextView(mContext); TV.setText(money); //TV.setTextSize(size); <<<< SET TEXT SIZE TV.measure(0, 0); params = new LinearLayout.LayoutParams(TV.getMeasuredWidth(), LayoutParams.WRAP_CONTENT); //params.setMargins(5, 0, 5, 0); // YOU CAN USE THIS LL.addView(TV, params); LL.measure(0, 0); widthSoFar += TV.getMeasuredWidth();// YOU MAY NEED TO ADD THE MARGINS newLL.addView(LL, params); for (int i = 0 ; i < textArray.length ; i++ ){ LL = new LinearLayout(mContext); LL.setOrientation(LinearLayout.HORIZONTAL); LL.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM); LL.setLayoutParams(new ListView.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); TV = new TextView(mContext); TV.setText(textArray[i]); //TV.setTextSize(size); <<<< SET TEXT SIZE TV.measure(0, 0); params = new LinearLayout.LayoutParams(TV.getMeasuredWidth(), LayoutParams.WRAP_CONTENT); //params.setMargins(5, 0, 5, 0); // YOU CAN USE THIS LL.addView(TV, params); LL.measure(0, 0); widthSoFar += TV.getMeasuredWidth();// YOU MAY NEED TO ADD THE MARGINS if (widthSoFar >= maxWidth) { ll.addView(newLL); newLL = new LinearLayout(mContext); newLL.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); newLL.setOrientation(LinearLayout.HORIZONTAL); newLL.setGravity(Gravity.LEFT); params = new LinearLayout.LayoutParams(LL .getMeasuredWidth(), LL.getMeasuredHeight()); newLL.addView(LL, params); widthSoFar = LL.getMeasuredWidth(); } else { newLL.addView(LL); } } ll.addView(newLL); } 

ЗАМЕТКА

Я не тестировал его … Я использовал его для более сложных вещей, и он работал … Возможно, вам придется немного подправить.

Я думаю, что вы не можете 🙁 Android os вычислить пробелы между строками в соответствии с размером шрифта, так что «30 $» делает разрыв между строкой 1 и строкой 2 больше, и я не знаю, возможно ли Контролируйте этот размер зазора.

Чтобы решить эту проблему, вы можете легко расширить LinearLayuot и поместить вертикальную ориентацию. Затем добавьте 2 текстовых изображения с прозрачной шириной ….

И чем реализовать функцию, скажем setNoGapText (String s); , И в этой функции вы можете измерить текст, который может быть помещен в текстовое представление сверху (это можно сделать с помощью textutils), а остальная часть текста будет полезна для textview2 …

Между этим текстовым просмотром вы можете играть с добавками и свойствами полей, поэтому промежутки между строками будут выглядеть так, как вы их себе представляете.