0

たとえば、変更されるコードを取得しようとしています

"^^テキスト^^"

このようなものに

テキスト

そのため、^^ トークンを削除し、「テキスト」文字列にスパン可能なテキストを追加して太字にする必要があります。今、私はこのコードを持っています。

public void format()
{
    TextView textView = (TextView) findViewById(R.id.test);

    CharSequence text = null;

    if(textView != null)
    {
         text = textView.getText();
    }

    String token = "^^";

    if(text != null)
    {
        int length = text.length();
        int start = text.toString().indexOf(token) + length;
        int end = text.toString().indexOf(token, start);

        if (start > -1 && end > -1)
        {
            SpannableStringBuilder ssb = new SpannableStringBuilder(text);

            ssb.setSpan(new ForegroundColorSpan(0x000000), start, end, 0);
            ssb.delete(end, end + length);
            ssb.delete(start - length, start);

            text = ssb;
            System.out.println("format");
        }

        System.out.println("works");
    }

    textView.setText(text);
    System.out.println("running");
}

このコードは、次のような onCreate で呼び出されます。

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    format();

    setContentView(R.layout.activity_tutorial_basic_file_test);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

これは私が使用している XML レイアウト ファイルです。

<LinearLayout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:text="@string/empty" />

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="2dp"
    android:layout_marginLeft="2dp"
    android:layout_marginRight="2dp"
    android:layout_marginTop="2dp" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/test_text"
            android:textColor="#FFFFFF" />
    </LinearLayout>
</ScrollView>

最後に、リソース ファイルで使用している文字列です。

<string name="test_text">Test string ^^ for ^^ formatter code</string>

私は何を間違っていますか、またはどうすればよいですか?

4

1 に答える 1

0

ここにはいくつかの問題があります。

  1. コンテンツのレイアウトを設定する前に呼び出しonCreateます。最初にレイアウトを設定し、次にその中で宣言されているビューを操作します。format()

    // First!
    setContentView(R.layout.activity_tutorial_basic_file_test);
    // Second!
    format();
    
  2. 形式で、誤っlengthtext. コードを見ると、それは間違いなく次の長さでなければなりませんtoken:

    // token length, not text length!
    int length = token.length();
    
  3. 色の値を値として提供することは、int多くの場合、アルファ値を明示的に設定する必要があることを意味することに注意してください。そうしないと、アルファが設定されます0(つまり、透明になります)。0x000000では(透明な黒) を使用しますが、 (不透明な黒)ForegroundColorSpanを設定する方が一般的です。0xff000000その場合は、行を次のように変更します。

    ssb.setSpan(new ForegroundColorSpan(0xff000000), start, end, 0);
    
  4. TextViewコンテンツをSpannableStringBuilder 直接に設定する必要があります。これは、TextViewがそれが であることを自動的に認識しSpannable、目的の書式設定を適用するためです。の文字列表現に設定しても、SpannableStringBuilder書式設定はまったく適用されません。したがって、次の行を置き換える必要があります。

    text = ssb;
    

    と:

    textView.setText(sbb);
    

    後者を削除します。

    textView.setText(text);
    

最終的なコードは次のとおりです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_format_test);
    format();
    // Your custom code was here, deleted for readability
}

public void format() {
    TextView textView = (TextView)findViewById(R.id.test);

    CharSequence text = null;

    if (textView != null) {
        text = textView.getText();
    }

    String token = "^^";

    if (text != null) {
        int length = token.length();
        int start = text.toString().indexOf(token) + length;
        int end = text.toString().indexOf(token, start + length);

        if (start > -1 && end > -1) {
            SpannableStringBuilder ssb = new SpannableStringBuilder(text);
            ssb.setSpan(new ForegroundColorSpan(0xff000000), start, end, 0);
            ssb.delete(end, end + length);
            ssb.delete(start - length, start);

            textView.setText(ssb);
            System.out.println("format");
        }

        System.out.println("works");
    }

    System.out.println("running");
}
于 2013-02-03T18:39:08.073 に答える