Intereting Posts

Как отрегулировать высоту строки в 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 …

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