0

我正在尝试获取一些例如会更改的代码

“^^文字^^”

变成这样

文字

所以我需要它来删除 ^^ 标记并在“text”字符串上添加一个 Spannable Text 使其变为粗体。现在我有这个代码。

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值通常意味着您应该明确设置 alpha 值。如果你不将 alpha 设置为0(即透明)。您在 中使用0x000000(transparent black) ForegroundColorSpan,但更常见的是设置0xff000000(opaque black)。如果是这种情况,请将行更改为:

    ssb.setSpan(new ForegroundColorSpan(0xff000000), start, end, 0);
    
  4. 您应该直接TextView将内容设置为. 这是因为自动看到它是 a并应用您想要的格式。而将其设置为的字符串表示形式根本不应用格式。所以你应该更换这一行:SpannableStringBuilder TextViewSpannableSpannableStringBuilder

    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 回答