Ответ 1
Вы можете попробовать использовать один из этих свойств TextView:
android:lineSpacingMultiplier
android:lineSpacingExtra
чтобы хотя бы попытаться сделать все строки одинаковой высоты (такие же, как и первая).
У меня есть 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 так, чтобы все строки имели одинаковый интервал?
Вы можете попробовать использовать один из этих свойств TextView:
android:lineSpacingMultiplier
android:lineSpacingExtra
чтобы хотя бы попытаться сделать все строки одинаковой высоты (такие же, как и первая).
После многих проб и ошибок я получил очень хакерское решение для работы:
Я добавил spannables с тем же удвоенным размером текста, что и выделенное слово, для каждого пространства внутри текста. Таким образом, весь TextView получил одинаковый (большой) межстрочный интервал. Помните, что вы не можете повторно использовать spannable.
Затем я дал TextView отрицательную строкуSpacingExtra, поэтому интервал между линиями снова выглядел приятным.
Чтобы избежать ненужных широких пространств из-за увеличения размера текста, я добавил 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...
между этим текстовым просмотром, который вы можете играть с добавками и свойствами полей, поэтому промежутки между строками будут выглядеть так, как вы их себе представляете.