Solution 1
1 - Create a selection for the dash. Like this:
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="5dp" /> <solid android:color="@android:color/transparent" /> <stroke android:color="@android:color/black" android:dashWidth="20px" android:dashGap="10px" android:width="3dp"/> </shape>
2 - set it as the background of your text view, it can be just a word.
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="8dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello!"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/button_shape" android:padding="4dp" android:text="world!"/> </LinearLayout>
Result:

Important Note. . This solution will work only for small text, for example, to show points in the game or small messengers. He will not adapt to large texts.
Decision 2
If you need a more complex solution that works for large texts, you can use Spannable.
1 → Create Custom Span Replacement
public class DashedBorderSpan extends ReplacementSpan { private Drawable mDrawable; private int mPadding; public DashedBorderSpan(Drawable drawable, int padding) { super(); mDrawable = drawable; mPadding = padding; } @Override public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { RectF rect = new RectF(x - mPadding, top - mPadding, x + measureText(paint, text, start, end) + mPadding, bottom + mPadding); mDrawable.setBounds((int) rect.left, (int)rect.top, (int)rect.right, (int)rect.bottom); canvas.drawText(text, start, end, x, y, paint); mDrawable.draw(canvas); } @Override public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { return Math.round(paint.measureText(text, start, end)); } private float measureText(Paint paint, CharSequence text, int start, int end) { return paint.measureText(text, start, end); } }
2 → Apply Spannable
TextView textView = (TextView) findViewById(R.id.textasd); String hello = "Dashed!"; SpannableStringBuilder stringBuilder = new SpannableStringBuilder(); stringBuilder.append(hello); stringBuilder.setSpan(new DrawableSpan(getDrawable(R.drawable.dashed_border_shape)), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); stringBuilder.append("not dashed... boring"); textView.setText(stringBuilder);
This solution will work for all cases. This is the best solution, although it is more complicated.
Example If you want to use it with a place owner, use it like this:
String someText = "Some Text!"; //R.string.placeholder = Hello: %s String formatedText = String.format(getString(R.string.placeholder), someText); SpannableStringBuilder stringBuilderPlaceHolder = new SpannableStringBuilder(); stringBuilderPlaceHolder.append(formatedText); stringBuilderPlaceHolder.setSpan(new DashedBorderSpan(getDrawable(R.drawable.dashed_border_shape), 10), formatedText.length() - someText.length(), formatedText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); textViewPlaceHolder.setText(stringBuilderPlaceHolder);
Result: 
Thus, the range will be set only in your place. If you have a more complex holder, use the same logic to achieve what you need.
Edit
There is a small problem with solution 2, but there is a solution .
You must take care to fill out the dotted box. If you use registration in a dotted frame, you will need to install an add-on in TextView that uses Span. In the image provided by the author of the question, you can see that the top and bottom lines were cropped (if you increase the filling, the lines will be completely deleted) to avoid using this add-on in your text form. Like this:
<TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="20dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginTop="30dp" android:paddingTop="3dp" <!-- This will fix the problem! --> android:paddingBottom="3dp" <!-- This will fix the problem! --> android:gravity="center_horizontal" android:text="blabla" android:textSize="20sp"/>
This will fix the problem =] Happy coding!