Skip to content

Commit d75ad7d

Browse files
committed
Add custom, click, url spans
1 parent 2bb3aa5 commit d75ad7d

File tree

4 files changed

+101
-21
lines changed

4 files changed

+101
-21
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
### v0.2
2+
3+
- New span support: `click`, `url`, `custom`
4+
- Function to apply spans on existing text: `span()`
5+
- Fixed replace in multiple occurrences text

README.md

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ This lib provides simple and fluent API for creating [Android Spannable](https:/
44
Features:
55
- Simple and fluent API
66
- Helpers to create spans
7-
- Small method footprint (<100 methods, 6kb AAR package)
7+
- Small method footprint (<100 methods, 16kb AAR package)
88

99
This library focuses on building spannable.
1010
If you prefer put full text first and then apply spans, take a look at [another awesome library](https://github.com/jaychang0917/SimpleText)
@@ -29,16 +29,48 @@ Spannable spannable = new Spanner()
2929
.append("superscript\n", superscript())
3030
.append(" \n", image(getResources().getDrawable(R.drawable.ic_android_16dp)))
3131
.append("quite\n", quote())
32-
.append("The quick brown fox jumps over the lazy dog\n", bold(), foreground(0xFF904f1c), quote())
32+
.append("The quick brown fox jumps over the lazy dog\n", bold(), foreground(0xFF904f1c), Spans.quote())
33+
.append("Custom\n", custom(new CustomSpan()))
34+
.append("Click here\n", click(onClickListener))
35+
.append("http://www.android.com\n", url("http://www.android.com"))
3336
;
3437
```
38+
Here is more methods to work with text:
39+
```java
40+
Spannable spannable = new Spanner("The quick brown fox jumps over the lazy dog")
41+
.span("fox", foreground(Color.RED)) // search and span by given text
42+
.replace("dog", "cat", strikeThrough()) // any number of spans
43+
.insert(5, "foo", bold(), italic()) // any number of spans
44+
.append("bar", underline()); // any number of spans
45+
```
3546

47+
You can use `span` to apply spans on the existing text:
3648
```java
3749
Spannable spannable = new Spanner("The quick brown fox jumps over the lazy dog")
38-
.replace("dog", "cat", strikeThrough() /* any number of spans */)
39-
.insert(5, "foo", bold(), italic() /* any number of spans */)
40-
.append("bar", underline() /* any number of spans */);
50+
.span("fox", foreground(Color.RED))
51+
.span("dog", foreground(Color.BLUE));
52+
```
53+
54+
If you need custom span, you have to use builder:
4155
```
56+
//java 7
57+
Spannable spannable = new Spanner("The quick brown fox jumps over the lazy dog")
58+
.span("fox", custom(new SpanBuilder() {
59+
@Override
60+
public Object build() {
61+
return new StyleSpan(Typeface.ITALIC);
62+
}
63+
});
64+
65+
//java 8
66+
Spannable spannable = new Spanner("The quick brown fox jumps over the lazy dog")
67+
.span("fox", custom(() -> new StyleSpan(Typeface.ITALIC));
68+
69+
//kotlin
70+
val spannable = Spanner("The quick brown fox jumps over the lazy dog")
71+
.span("fox", custom { StyleSpan(Typeface.ITALIC) })
72+
```
73+
4274
#### How to use
4375
```
4476
allprojects {
@@ -49,7 +81,7 @@ Spannable spannable = new Spanner("The quick brown fox jumps over the lazy dog")
4981
}
5082
5183
dependencies {
52-
compile 'lt.neworld:spanner:v0.1'
84+
compile 'lt.neworld:spanner:v0.2'
5385
}
5486
```
5587

lib/src/main/java/lt/neworld/spanner/Spans.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.support.annotation.FloatRange;
1010
import android.text.style.AbsoluteSizeSpan;
1111
import android.text.style.BackgroundColorSpan;
12+
import android.text.style.ClickableSpan;
1213
import android.text.style.ForegroundColorSpan;
1314
import android.text.style.ImageSpan;
1415
import android.text.style.QuoteSpan;
@@ -18,7 +19,9 @@
1819
import android.text.style.SubscriptSpan;
1920
import android.text.style.SuperscriptSpan;
2021
import android.text.style.TypefaceSpan;
22+
import android.text.style.URLSpan;
2123
import android.text.style.UnderlineSpan;
24+
import android.view.View;
2225

2326
/**
2427
* @author Andrius Semionovas
@@ -186,4 +189,31 @@ public Object build() {
186189
}
187190
});
188191
}
192+
193+
public static Span custom(SpanBuilder builder) {
194+
return new Span(builder);
195+
}
196+
197+
public static Span click(final View.OnClickListener onClickListener) {
198+
return new Span(new SpanBuilder() {
199+
@Override
200+
public Object build() {
201+
return new ClickableSpan() {
202+
@Override
203+
public void onClick(View view) {
204+
onClickListener.onClick(view);
205+
}
206+
};
207+
}
208+
});
209+
}
210+
211+
public static Span url(final String url) {
212+
return new Span(new SpanBuilder() {
213+
@Override
214+
public Object build() {
215+
return new URLSpan(url);
216+
}
217+
});
218+
}
189219
}
Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,21 @@
11
package lt.neworld.spanner.sample;
22

33
import android.graphics.Color;
4+
import android.graphics.Typeface;
45
import android.os.Bundle;
56
import android.support.v7.app.AppCompatActivity;
67
import android.text.Spannable;
8+
import android.text.method.LinkMovementMethod;
9+
import android.text.style.StyleSpan;
10+
import android.view.View;
711
import android.widget.TextView;
12+
import android.widget.Toast;
813

14+
import lt.neworld.spanner.SpanBuilder;
915
import lt.neworld.spanner.Spanner;
1016
import lt.neworld.spanner.Spans;
1117

12-
import static lt.neworld.spanner.Spans.background;
13-
import static lt.neworld.spanner.Spans.bold;
14-
import static lt.neworld.spanner.Spans.boldItalic;
15-
import static lt.neworld.spanner.Spans.font;
16-
import static lt.neworld.spanner.Spans.foreground;
17-
import static lt.neworld.spanner.Spans.image;
18-
import static lt.neworld.spanner.Spans.italic;
19-
import static lt.neworld.spanner.Spans.quote;
20-
import static lt.neworld.spanner.Spans.scaleSize;
21-
import static lt.neworld.spanner.Spans.sizeDP;
22-
import static lt.neworld.spanner.Spans.strikeThrough;
23-
import static lt.neworld.spanner.Spans.subscript;
24-
import static lt.neworld.spanner.Spans.superscript;
25-
import static lt.neworld.spanner.Spans.underline;
18+
import static lt.neworld.spanner.Spans.*;
2619

2720
public class SampleJavaActivity extends AppCompatActivity {
2821

@@ -33,6 +26,15 @@ protected void onCreate(Bundle savedInstanceState) {
3326

3427
TextView textView = findViewById(R.id.text);
3528

29+
textView.setMovementMethod(new LinkMovementMethod());
30+
31+
View.OnClickListener onClickListener = new View.OnClickListener() {
32+
@Override
33+
public void onClick(View view) {
34+
Toast.makeText(view.getContext(), "Clicked", Toast.LENGTH_LONG).show();
35+
}
36+
};
37+
3638
// @formatter:off
3739
Spannable spannable = new Spanner()
3840
.append("Original text\n\n")
@@ -50,13 +52,24 @@ protected void onCreate(Bundle savedInstanceState) {
5052
.append("subscript\n", subscript())
5153
.append("superscript\n", superscript())
5254
.append(" \n", image(getResources().getDrawable(R.drawable.ic_android_16dp)))
53-
.append("quite\n", Spans.quote())
55+
.append("quite\n", quote())
5456
.append("The quick brown fox jumps over the lazy dog\n", bold(), foreground(0xFF904f1c), Spans.quote())
5557
.span("fox", foreground(Color.RED))
5658
.span("dog", foreground(Color.RED))
59+
.append("Custom\n", custom(new CustomSpan()))
60+
.append("Click here\n", click(onClickListener))
61+
.append("http://www.android.com\n", url("http://www.android.com"))
5762
;
5863
// @formatter:on
5964

6065
textView.setText(spannable);
6166
}
6267
}
68+
69+
class CustomSpan implements SpanBuilder {
70+
@Override
71+
public Object build() {
72+
return new StyleSpan(Typeface.BOLD);
73+
}
74+
}
75+

0 commit comments

Comments
 (0)