3

次のようなものを含むtextViewを構築する必要があります:「タイトル[x]」、「テキスト」、「\ n」、「タイトル[y]」、「その他のテキスト」など

タイトル[x] いくつかのテキスト

Title[y] その他のテキスト

タイトルを太字にし、タイトルごとに異なる色にする必要があります。合計で 11 のタイトルと最大 30 のテキスト文字列から選択でき、どのタイトルにも任意のテキスト文字列を含めることができます。各サイクルで、最終的な結果テキストに 1 ~ 6 個のタイトルが含まれます。x と y の "既知の" 値を使用して textView を構築することに問題はありませんが、実際には、スパン可能な文字列を構築するまで値を知りません。文字列のすべての可能なバリエーションを構築したくありません。 (300以上)。すべての「タイトル」スパンナブルを作成し、作成時にそれらを「結果」に追加しようとしましたが、正常に動作しますが、それらをすべて作成して最後に 1 つのステートメントに追加すると、太字と色の属性が失われます.

私の main.xml には、color_test の ID を持つ textView があります。

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

}
}
4

1 に答える 1

2

あなたの問題を正しく理解しているかどうかはよくわかりません。しかし、そうするなら、必要なすべての属性を含むクラスを作成し、実行時にオブジェクトを作成します。

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>();
于 2012-06-03T12:02:12.997 に答える