2011-08-23 2 views
0

У меня есть приложение, в котором мне нужно отображать список чисел, но цифры должны быть отформатированы в зависимости от их значения. Отрицательные числа показаны в обычном тексте, положительные числа показаны как жирным шрифтом. Кроме того, число должно всегда казаться позитивным в текстовом представлении. Я попытался простирающийся TextView с SetText перекрываться как таковой:Текст TextView, отформатированный на основе текстового значения

@Override 
public void setText(CharSequence text, TextView.BufferType type) { 
    double number = Double.parseDouble(text.toString()); 

    if (number > 0) { 
     this.setTypeface(this.getTypeface(), BOLD); 
    } else { 
     this.setTypeface(this.getTypeface(), NORMAL); 
     number = Math.abs(number); 
    } 

    super.setText(number + "", type); 
} 

Это не совсем работа, как SetText было называют несколько раз на одной и той же MyTextView. Это привело к тому, что каждое число было выделено жирным шрифтом, поскольку в следующий раз оно было положительным.

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

Есть ли способ, которым я могу это сделать в виде виджета?

+0

Вы пробовали http://plugins.jquery.com/plugin-tags/number-format – mozillanerd

+0

вместо переопределения SetText (CharSequence) почему бы не сделать новый SetText (дважды). Также, если я правильно помню, когда я пытался получить форматированный текст, мне было гораздо лучше повезло с fromHtml(), а не setTypeFace(). – FoamyGuy

+0

Я думал об этом, но я использую MyTextView в паре адаптеров. Я мог бы свернуть собственный адаптер для использования setText (double), но я думаю, что было бы проще просто позаботиться обо всем этом в MyTextView. – Chewie

ответ

0

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

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    TextView text = (TextView) view.findViewById(R.id.special_text); 

    double amount = cursor.getDouble(cursor.getColumnIndex(DbAdapter.KEY_NUMBER)); 

    if (amount > 0) { 
     amountText.setTypeface(null, Typeface.BOLD); 
    } else { 
     amountText.setTypeface(null, Typeface.NORMAL); 
     amount = Math.abs(amount); 
    } 

    text.setText(amount); 
} 
0

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

private double originalValue = 0; 

@Override 
public void setText(CharSequence text, TextView.BufferType type) { 
    if(originalValue==0) { 
     originalValue = Double.parseDouble(text.toString()); 
    }   
    this.setTypeface(this.getTypeface(), originalValue>0 ? BOLD : NORMAL); 
    super.setText(Math.abs(originalValue), type); 
} 
Смежные вопросы