2012-06-03 4 views
2

У меня есть требование для создания textView, который содержит что-то вроде: «Заголовок [x]», за которым следует «некоторый текст», за которым следует «\ n», за которым следует «Название [y]», а затем «больше текста» и т. Д. даваяМогу ли я «хранить» spannable строки в массиве?

Название [х] какой-то текст

Название [у] больше текста

Мне нужно Название быть смелыми и иметь разный цвет для каждого заголовка. У меня есть 11 названий в общей сложности и до 30 текстовых строк на выбор, и любой заголовок может содержать любую текстовую строку. В каждом цикле у меня будет от 1 до 6 титров в моем окончательном результате. У меня нет проблем с построением textView с «известными» значениями x и y, но в реальной жизни я не буду знать значения до тех пор, пока не приступлю к созданию растянутой строки. Я не хочу строить все возможные варианты строки (более 300). Я попытался создать все «заголовок» и добавить их к своему «результату», когда создаю их, и он работает нормально, но если я их создам и добавлю в один оператор в конце, я потеряю полужирный и цвет атрибуты.

Мой main.xml имеет TextView с идентификатором color_test.

package uk.cmj.color; 

import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.text.SpannableString; 
import android.text.SpannableStringBuilder; 
import android.text.style.ForegroundColorSpan; 
import android.text.style.StyleSpan; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.TextView.BufferType; 

public class ColorActivity extends Activity { 
/** Called when the activity is first created. */ 

private static int titleIndex = 0; 
private final String[] titles = {"Title A", "Title B", "Title C"};  

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

// --------------------------------------------- 
// THIS WORKS AND I SEE COLOR AND BOLD FOR TITLE 
// --------------------------------------------- 

titleIndex = 1; 

SpannableStringBuilder resultText = new SpannableStringBuilder(); 
String firstTitle = titles[titleIndex]; 
SpannableString firstTitleSpannable= new SpannableString(firstTitle); 
firstTitleSpannable.setSpan(new ForegroundColorSpan(Color.rgb(155,79,25)), 0, firstTitle.length(), 0); 
firstTitleSpannable.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, firstTitle.length(), 0); 
resultText.append(firstTitleSpannable); 

String body1 = " some text" + "\n"; 
SpannableString body1Spannable= new SpannableString(body1); 
body1Spannable.setSpan(new ForegroundColorSpan(Color.BLACK), 0, body1.length(), 0); 
resultText.append(body1Spannable); 

titleIndex = 2; 

String nextTitle = titles[titleIndex]; 
SpannableString nextTitleSpannable= new SpannableString(nextTitle); 
nextTitleSpannable.setSpan(new ForegroundColorSpan(Color.rgb(155,79,25)), 0, nextTitle.length(), 0); 
nextTitleSpannable.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, nextTitle.length(), 0); 
resultText.append(nextTitleSpannable + "\n"); 

String body2 = " some different text" + "\n"; 
SpannableString body2Spannable= new SpannableString(body2); 
body1Spannable.setSpan(new ForegroundColorSpan(Color.BLACK), 0, body1.length(), 0); 
resultText.append(body2Spannable); 

TextView color_test = (TextView) findViewById(R.id.color_test); 
color_test.setText(resultText, BufferType.SPANNABLE); 

// ------------------------------------------ 
// THIS DOESN'T WORK AS I LOSE COLOR AND BOLD 
// ------------------------------------------ 

titleIndex = 1; 

SpannableStringBuilder resultText = new SpannableStringBuilder(); 
String firstTitle = titles[titleIndex]; 
SpannableString firstTitleSpannable= new SpannableString(firstTitle); 
firstTitleSpannable.setSpan(new ForegroundColorSpan(Color.rgb(155,79,25)), 0, firstTitle.length(), 0); 
firstTitleSpannable.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, firstTitle.length(), 0); 

String body1 = " some text" + "\n"; 
SpannableString body1Spannable= new SpannableString(body1); 
body1Spannable.setSpan(new ForegroundColorSpan(Color.BLACK), 0, body1.length(), 0); 
resultText.append(body1Spannable); 

titleIndex = 2; 

String nextTitle = titles[titleIndex]; 
SpannableString nextTitleSpannable= new SpannableString(nextTitle); 
nextTitleSpannable.setSpan(new ForegroundColorSpan(Color.rgb(155,79,25)), 0, nextTitle.length(), 0); 
nextTitleSpannable.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, nextTitle.length(), 0); 

String body2 = " some different text" + "\n"; 
SpannableString body2Spannable= new SpannableString(body2); 
body1Spannable.setSpan(new ForegroundColorSpan(Color.BLACK), 0, body1.length(), 0); 
resultText.append(body2Spannable); 

resultText.append(firstTitleSpannable 
       + body1Spannable 
       + nextTitleSpannable 
       + body2Spannable); 


TextView color_test = (TextView) findViewById(R.id.color_test); 
color_test.setText(resultText, BufferType.SPANNABLE); 

} 
} 

ответ

1

Я не совсем уверен, если я понимаю вашу проблему правильно. Но если я делаю, я бы написать класс который содержит все необходимые атрибуты и создает объекты во время работы:

public class SpannableContent { 
    private StringBuilder result = new StringBuilder(); 
    private String title1 = null; 
    private String title2 = null; 
    private String description = null; 

    public SpannableContent(String _title1, String _title2, String _desc) { 
     this.title1 = _title1; 
     this.title2 = _title2; 
     this.description = _desc; 

     result.append(getFormatedTitle1()); 
     result.append(getFormatedTitle2()); 
     result.append(getFormatedDescription()); 
    } 

    private String getFormatedTitle1() { 
     String resString = null; 
     // do whatever Spannable stuff you want to do w/ title1 here 

     return resString; 
    } 

    private String getFormatedTitle2() { 
     String resString = null; 
     // do whatever Spannable stuff you want to do w/ title2 here 

     return resString; 
    } 

    private String getFormatedDescription() { 
     String resString = null; 
     // do whatever Spannable stuff you want to do w/ the description here 

     return resString; 
    } 

    public String getFinalContent() { 
     return result.toString(); 
    } 
} 

Затем сделать во время выполнения чего-то вроде

SpannableContent spannableC = new SpannableContent(dynamicTitle1, dynamicTitle2, dynamicDesc); 
resultText.append(spannableC.getFinalContent()); 

Вы можете хранить объекты в ArrayList типа SpannableContent.

ArrayList<SpannableContent> spannableArrayList = new ArrayList<SpannableContent>(); 
+0

Благодарим за это. Я фактически решил свою проблему, создав массив с номерами RGB для каждой строки, что сделало эту работу. Я очень новичок в android/java, поэтому все решения полезны для меня. В настоящий момент его работа важнее, чем эффективная работа - в конце концов я доберусь до этого этапа! ArrayList теперь находится в моем списке предметов для расследования! – Marvin

Смежные вопросы