简体   繁体   中英

How to write part of a string bold in Android programmatically?

I have been searching on the Internet for a solution to my problem. I need to write some text with headlines. The headlines should be bold. What I found on the Internet is how to write the whole string as bold.

Eg

Step 1: Open Android Studio

Step 2: ............

How is that done in Android? Can it be done, or do I have to split the strings eg the headline should be a separate string.

I have tried the HTML tag on Android, but I get a java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference

This I what I tried in Android

String[] text = new String[2];
text[0] = "<b>" + "Den første bøn er middagsbønnen" + "</b>" + "Den anden bøn er eftermiddagsbønnen"
tvTitle.setText(Html.fromHtml(text[mPage])); //This line triggers the exception

The mPage is just the page of the tab as I only want the text to appear in one tab.

EDIT:

My class

public class PageFragment_Bontider extends Fragment{

public static final String ARG_PAGE = "ARG_PAGE";

private int mPage;

public static PageFragment_Bontider newInstance(int page) {
        Bundle args = new Bundle();
        args.putInt(ARG_PAGE, page);
        PageFragment_Bontider  fragment = new PageFragment_Bontider ();
        fragment.setArguments(args);
        return fragment;
        }

@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPage = getArguments().getInt(ARG_PAGE);
        }

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_bontider, container, false);
        TextView tvTitle = (TextView) view.findViewById(R.id.bonner);
        ImageView bontider = (ImageView) view.findViewById(R.id.imageView);

        String[] text = new String[2];

        text[1] = "Iblandt forpligtelserne for enhver ansvarlig (mukallaf) er udførelse af de fem " +
                "bønner i løbet af dagen og natten. Eftersom kendskabet til disse bøntider er en " +
                "pligt for enhver ansvarlig, gøres der rede for dem i det følgende:\n\n" +
                "Den første bøn er middagsbønnen (Adh-Dhuhr), hvis tid indtræder, når solen aftager " +
                "fra sit højeste punkt på himlen (midten af himlen) mod vest, og udtræder når skyggen" +
                " af en tilfældig genstand bliver lige så lang som en genstands egen længde adderet " +
                "med længden af kulminationsskyggen. Kulminationsskyggen er den målte skygge, når " +
                "solen er ved sit højeste punkt i løbet af en dag.\n\n" +
                "Den anden bøn er eftermiddagsbønnen (Al-^asr), hvis tid varer fra middagsbønnens " +
                "udtrædelse til solnedgang (når hele solskiven er forsvundet).\n\n" +
                "Den tredje bøn er solnedgangsbønnen (Al-Maghrib), hvis tid indtræder fra " +
                "eftermiddagsbønnens udtrædelse, og udtræder når det rødlige skumringslys " +
                "(svagt lys der dukker op i den vestlige horisont efter solnedgang) er forsvundet.\n\n" +
                "Den fjerde bøn er natbønnen (Al-^Ishaa´), hvis tid indtræder ved solnedgangsbønnens " +
                "udtrædelse, og udtræder ved frembrudet af det sande daggry (Al-Fadjir As-Saadiq), " +
                "hvilket er det vandrette lys, der viser sig i den østlige horisont, som et tyndt " +
                "skær der dernæst udbreder sig.\n\n" +
                "Den femte bøn er morgenbønnen (As-Subh), hvis tid indtræder ved natbønnens udtrædelse, " +
                "og udtræder ved solopgang (Shuruuq).";

        tvTitle.setText(text[mPage]);

        int[] billede = new int[2];

        billede[0] = R.drawable.bontider;

        if(billede[mPage] != 0){
            bontider.setVisibility(View.VISIBLE);
            bontider.setImageResource(billede[mPage]);
            tvTitle.setVisibility(View.GONE);
        }

        return view;
        }
}

There is no need to create separate text views. You can use SpannableString to achieve your goal. Following is the sample code for changing string style in different ways. You will just have to calculate starting and ending index inside the string.

SpannableString styledString
  = new SpannableString("Large\n\n"     // index 0 - 5
       + "Bold\n\n"          // index 7 - 11
       + "Underlined\n\n"    // index 13 - 23
       + "Italic\n\n"        // index 25 - 31
       + "Strikethrough\n\n" // index 33 - 46
       + "Colored\n\n"       // index 48 - 55
       + "Highlighted\n\n"   // index 57 - 68
       + "K Superscript\n\n" // "Superscript" index 72 - 83 
       + "K Subscript\n\n"   // "Subscript" index 87 - 96
       + "Url\n\n"           //  index 98 - 101
       + "Clickable\n\n");   // index 103 - 112

 // make the text twice as large
 styledString.setSpan(new RelativeSizeSpan(2f), 0, 5, 0);

 // make text bold
 styledString.setSpan(new StyleSpan(Typeface.BOLD), 7, 11, 0);

 // underline text
 styledString.setSpan(new UnderlineSpan(), 13, 23, 0);

 // make text italic
 styledString.setSpan(new StyleSpan(Typeface.ITALIC), 25, 31, 0);

 styledString.setSpan(new StrikethroughSpan(), 33, 46, 0);

 // change text color
 styledString.setSpan(new ForegroundColorSpan(Color.GREEN), 48, 55, 0);

 // highlight text
 styledString.setSpan(new BackgroundColorSpan(Color.CYAN), 57, 68, 0);

 // superscript
 styledString.setSpan(new SuperscriptSpan(), 72, 83, 0);
 // make the superscript text smaller
 styledString.setSpan(new RelativeSizeSpan(0.5f), 72, 83, 0);

 // subscript
 styledString.setSpan(new SubscriptSpan(), 87, 96, 0);
 // make the subscript text smaller
 styledString.setSpan(new RelativeSizeSpan(0.5f), 87, 96, 0);

 // url
 styledString.setSpan(new URLSpan("http://www.google.com"), 98, 101, 0);

 // clickable text
 ClickableSpan clickableSpan = new ClickableSpan() {

 @Override
 public void onClick(View widget) {
    // We display a Toast. You could do anything you want here.
    Toast.makeText(SpanExample.this, 
    "Clicked",Toast.LENGTH_SHORT).show();

    }
 };

styledString.setSpan(clickableSpan, 103, 112, 0);

// this step is mandated for the url and clickable styles.
textView.setMovementMethod(LinkMovementMethod.getInstance());

// make it neat
textView.setGravity(Gravity.CENTER);

tvTitle.setText(styledString);

You can use text spans.

SpannableStringBuilder builder = new SpannableStringBuilder("Hello, world!"); StyleSpan span = new StyleSpan(android.graphics.Typeface.BOLD); builder.setSpan(span, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);

When you set the text, pass the builder directly without invoking toString() .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM