# PrecomputedTextCompat

Artifact: [androidx.core:core](https://developer.android.com/jetpack/androidx/releases/core) [View Source](https://cs.android.com/search?q=file:androidx/core/text/PrecomputedTextCompat.java+class:androidx.core.text.PrecomputedTextCompat) Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

*** ** * ** ***


```
public class PrecomputedTextCompat implements Spannable
```

<br />

*** ** * ** ***

A text which has the character metrics data. A text object that contains the character metrics data and can be used to improve the performance of text layout operations. When a PrecomputedTextCompat is created with a given `https://developer.android.com/reference/java/lang/CharSequence.html`, it will measure the text metrics during the creation. This PrecomputedText instance can be set on `https://developer.android.com/reference/android/widget/TextView.html` or `https://developer.android.com/reference/android/text/StaticLayout.html`. Since the text layout information will be included in this instance, `https://developer.android.com/reference/android/widget/TextView.html` or `https://developer.android.com/reference/android/text/StaticLayout.html` will not have to recalculate this information. On API 29 or later, there is full PrecomputedText support by framework. From API 23 to API 27, PrecomputedTextCompat relies on internal text layout cache. PrecomputedTextCompat immediately computes the text layout in the constructor to warm up the internal text layout cache. Note that any `https://developer.android.com/reference/android/text/NoCopySpan.html` attached to the original text won't be passed to PrecomputedText.

## Summary

| ### Nested types |
|---|
| `public final class https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat.Params` The information required for building `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat`. |
| `public class https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat.Params.Builder` A builder for creating `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat.Params`. |

| ### Public methods |
|---|---|
| `char` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#charAt(int)(int index)` |
| `static https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#create(java.lang.CharSequence,androidx.core.text.PrecomputedTextCompat.Params)( @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/CharSequence.html text, @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat.Params params )` Create a new `https://developer.android.com/reference/android/text/PrecomputedText.html` which will pre-compute text measurement and glyph positioning information. |
| `@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#getParagraphCount()()` Returns the count of paragraphs. |
| `@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#getParagraphEnd(int)(@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int paraIndex)` Returns the paragraph end offset of the text. |
| `@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#getParagraphStart(int)(@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int paraIndex)` Returns the paragraph start offset of the text. |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat.Params` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#getParams()()` Returns the parameters used to measure this text. |
| `int` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#getSpanEnd(java.lang.Object)(https://developer.android.com/reference/java/lang/Object.html tag)` |
| `int` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#getSpanFlags(java.lang.Object)(https://developer.android.com/reference/java/lang/Object.html tag)` |
| `int` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#getSpanStart(java.lang.Object)(https://developer.android.com/reference/java/lang/Object.html tag)` |
| `T[]` | `<T> https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#getSpans(int,int,java.lang.Class<T>)(int start, int end, https://developer.android.com/reference/java/lang/Class.html<T> type)` //////////////////////////////////////////////////////////////////////////////////////////// |
| `static https://developer.android.com/reference/java/util/concurrent/Future.html<https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat>` | `@https://developer.android.com/reference/androidx/annotation/UiThread https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#getTextFuture(java.lang.CharSequence,androidx.core.text.PrecomputedTextCompat.Params,java.util.concurrent.Executor)( @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/CharSequence.html charSequence, @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat.Params params, @https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/java/util/concurrent/Executor.html executor )` Helper for PrecomputedText that returns a future to be used with `https://developer.android.com/reference/androidx/appcompat/widget/AppCompatTextView#setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat>)`. |
| `int` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#length()()` //////////////////////////////////////////////////////////////////////////////////////////// |
| `int` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#nextSpanTransition(int,int,java.lang.Class)(int start, int limit, https://developer.android.com/reference/java/lang/Class.html type)` |
| `void` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#removeSpan(java.lang.Object)(https://developer.android.com/reference/java/lang/Object.html what)` |
| `void` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#setSpan(java.lang.Object,int,int,int)(https://developer.android.com/reference/java/lang/Object.html what, int start, int end, int flags)` |
| `https://developer.android.com/reference/java/lang/CharSequence.html` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#subSequence(int,int)(int start, int end)` |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html` | `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat#toString()()` |

| ### Inherited Constants |
|---|
| From [android.text.Spanned](https://developer.android.com/reference/android/text/Spanned.html) |---|---| | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_COMPOSING = 256` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_EXCLUSIVE_EXCLUSIVE = 33` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_EXCLUSIVE_INCLUSIVE = 34` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_INCLUSIVE_EXCLUSIVE = 17` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_INCLUSIVE_INCLUSIVE = 18` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_INTERMEDIATE = 512` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_MARK_MARK = 17` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_MARK_POINT = 18` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_PARAGRAPH = 51` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_POINT_MARK = 33` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_POINT_MARK_MASK = 51` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_POINT_POINT = 34` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_PRIORITY = 16711680` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_PRIORITY_SHIFT = 16` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_USER = -16777216` | | `static final int` | `https://developer.android.com/reference/android/text/Spanned.html#SPAN_USER_SHIFT = 24` | |

| ### Inherited methods |
|---|
| From [java.lang.CharSequence](https://developer.android.com/reference/java/lang/CharSequence.html) |---|---| | `https://developer.android.com/reference/java/util/stream/IntStream.html` | `https://developer.android.com/reference/java/lang/CharSequence.html#chars()()` | | `https://developer.android.com/reference/java/util/stream/IntStream.html` | `https://developer.android.com/reference/java/lang/CharSequence.html#codePoints()()` | | `static int` | `https://developer.android.com/reference/java/lang/CharSequence.html#compare(java.lang.CharSequence, java.lang.CharSequence)(https://developer.android.com/reference/java/lang/CharSequence.html cs1, https://developer.android.com/reference/java/lang/CharSequence.html cs2)` | | `void` | `https://developer.android.com/reference/java/lang/CharSequence.html#getChars(int, int, char[], int)(int srcBegin, int srcEnd, char[] dst, int dstBegin)` | | `boolean` | `https://developer.android.com/reference/java/lang/CharSequence.html#isEmpty()()` | |

## Public methods

### charAt

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public char charAt(int index)
```

### create

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public static PrecomputedTextCompat create(
    @NonNull CharSequence text,
    @NonNull PrecomputedTextCompat.Params params
)
```

Create a new `https://developer.android.com/reference/android/text/PrecomputedText.html` which will pre-compute text measurement and glyph positioning information.

This can be expensive, so computing this on a background thread before your text will be presented can save work on the UI thread.
Note that any `https://developer.android.com/reference/android/text/NoCopySpan.html` attached to the text won't be passed to the created PrecomputedText.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/CharSequence.html text` | the text to be measured |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat.Params params` | parameters that define how text will be precomputed |

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat` | A `https://developer.android.com/reference/android/text/PrecomputedText.html` |

### getParagraphCount

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public @IntRange(from = 0) int getParagraphCount()
```

Returns the count of paragraphs.

### getParagraphEnd

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public @IntRange(from = 0) int getParagraphEnd(@IntRange(from = 0) int paraIndex)
```

Returns the paragraph end offset of the text.

### getParagraphStart

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public @IntRange(from = 0) int getParagraphStart(@IntRange(from = 0) int paraIndex)
```

Returns the paragraph start offset of the text.

### getParams

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public @NonNull PrecomputedTextCompat.Params getParams()
```

Returns the parameters used to measure this text.

### getSpanEnd

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public int getSpanEnd(Object tag)
```

### getSpanFlags

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public int getSpanFlags(Object tag)
```

### getSpanStart

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public int getSpanStart(Object tag)
```

### getSpans

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public T[] <T> getSpans(int start, int end, Class<T> type)
```

////////////////////////////////////////////////////////////////////////////////////////////

### getTextFuture

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
@UiThread
public static Future<PrecomputedTextCompat> getTextFuture(
    @NonNull CharSequence charSequence,
    @NonNull PrecomputedTextCompat.Params params,
    @Nullable Executor executor
)
```

Helper for PrecomputedText that returns a future to be used with `https://developer.android.com/reference/androidx/appcompat/widget/AppCompatTextView#setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat>)`. PrecomputedText is suited to compute on a background thread, but when TextView properties are dynamic, it's common to configure text properties and text at the same time, when binding a View. For example, in a RecyclerView Adapter:

```
    void onBindViewHolder(ViewHolder vh, int position) {
        ItemData data = getData(position);

        vh.textView.setTextSize(...);
        vh.textView.setFontVariationSettings(...);
        vh.textView.setText(data.text);
    }
```
In such cases, using PrecomputedText is difficult, since it isn't safe to defer the setText() code arbitrarily - a layout pass may happen before computation finishes, and will be incorrect if the text isn't ready yet.

With `getTextFuture()`, you can block on the result of the precomputation safely before the result is needed. AppCompatTextView provides `https://developer.android.com/reference/androidx/appcompat/widget/AppCompatTextView#setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat>)` for exactly this use case. With the following code, the app's layout work is largely done on a background thread:

```
    void onBindViewHolder(ViewHolder vh, int position) {
        ItemData data = getData(position);

        vh.textView.setTextSize(...);
        vh.textView.setFontVariationSettings(...);

        // start precompute
        Futurefuture = PrecomputedTextCompat.getTextFuture(
                data.text, vh.textView.getTextMetricsParamsCompat(), myExecutor);

        // and pass future to TextView, which awaits result before measuring
        vh.textView.setTextFuture(future);
    }
```
Because RecyclerView `https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.LayoutManager#isItemPrefetchEnabled()` bind multiple frames in advance while scrolling, the text work generally has plenty of time to complete before measurement occurs.

**Note:** all TextView layout properties must be set before creating the Params object. If they are changed during the precomputation, this can cause a `https://developer.android.com/reference/java/lang/IllegalArgumentException.html` when the precomputed value is consumed during measure, and doesn't reflect the TextView's current state.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/CharSequence.html charSequence` | the text to be displayed |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat.Params params` | the parameters to be used for displaying text |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/java/util/concurrent/Executor.html executor` | the executor to be process the text layout. If null is passed, the default single threaded pool will be used. |

| Returns |
|---|---|
| `https://developer.android.com/reference/java/util/concurrent/Future.html<https://developer.android.com/reference/androidx/core/text/PrecomputedTextCompat>` | a future of the precomputed text |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/appcompat/widget/AppCompatTextView#setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat>)` |   |

### length

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public int length()
```

////////////////////////////////////////////////////////////////////////////////////////////

### nextSpanTransition

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public int nextSpanTransition(int start, int limit, Class type)
```

### removeSpan

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public void removeSpan(Object what)
```

| Throws |
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalArgumentException.html` | if `https://developer.android.com/reference/android/text/style/MetricAffectingSpan.html` is specified. |

### setSpan

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public void setSpan(Object what, int start, int end, int flags)
```

| Throws |
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalArgumentException.html` | if `https://developer.android.com/reference/android/text/style/MetricAffectingSpan.html` is specified. |

### subSequence

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public CharSequence subSequence(int start, int end)
```

### toString

```
public @NonNull String toString()
```