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

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

25
задан emmby 15 June 2010 в 15:28
поделиться

4 ответа

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

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

  2. Затем я дал TextView отрицательный lineSpacingExtra, чтобы межстрочный интервал снова выглядел хорошо.

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

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

2
ответ дан miracula 15 June 2010 в 15:28
поделиться

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

INPUT

  • LinearLayout ll:

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

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

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

  • Текст строки:

    текст

  • Контекст mContext

    контекст

ЧТО ДЕЛАТЬ

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


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);
}

ПРИМЕЧАНИЕ

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

1
ответ дан Sherif elKhatib 15 June 2010 в 15:28
поделиться
  • 1
    Вы сохранили меня. Я использовал это из вниз ответа: если (jQuery (e.target) .is (' вход, текстовая область, select')) {возврат;} – Osify 13 March 2015 в 07:45
  • 2
    Вы сохранили меня. Я использовал это из вниз ответа: если (jQuery (e.target) .is (' вход, текстовая область, select')) {возврат;} – Osify 13 March 2015 в 07:45
  • 3
    Вы сохранили меня. Я использовал это из вниз ответа: если (jQuery (e.target) .is (' вход, текстовая область, select')) {возврат;} – Osify 13 March 2015 в 07:45
  • 4
    Вы сохранили меня. Я использовал это из вниз ответа: если (jQuery (e.target) .is (' вход, текстовая область, select')) {возврат;} – Osify 13 March 2015 в 07:45
  • 5
    Вы сохранили меня. Я использовал это из вниз ответа: если (jQuery (e.target) .is (' вход, текстовая область, select')) {возврат;} – Osify 13 March 2015 в 07:45

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

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

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

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

0
ответ дан Lukap 15 June 2010 в 15:28
поделиться

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

android:lineSpacingMultiplier
android:lineSpacingExtra

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

43
ответ дан duggu 15 June 2010 в 15:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: