简体   繁体   English

如何在Android中以编程方式编写字符串的粗体部分?

[英]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 步骤1:开启Android Studio

Step 2: ............ 步骤2: ......

How is that done in Android? 如何在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 我已经在Android上尝试了HTML标记,但是得到了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 这是我在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. mPage只是选项卡的页面,因为我只希望文本出现在一个选项卡中。

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. 您可以使用SpannableString实现您的目标。 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() . 设置文本时,无需调用toString()即可直接传递构建器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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