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

Posted

技术标签:

【中文标题】如何以编程方式在Android中编写部分字符串粗体?【英文标题】:How to write part of a string bold in Android programmatically? 【发布时间】:2018-05-01 14:43:30 【问题描述】:

我一直在 Internet 上搜索我的问题的解决方案。我需要写一些带有标题的文字。标题应该是粗体的。我在网上找到的是如何将整个字符串写成粗体。

例如

第 1 步:打开 android Studio

第 2 步: ....

在 Android 中是如何做到的?可以完成吗,还是我必须拆分字符串,例如标题应该是一个单独的字符串。

我在 Android 上尝试过 html 标签,但我得到了 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference

这是我在 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

mPage 只是选项卡的页面,因为我只希望文本出现在一个选项卡中。

编辑:

我的班级

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;
        

【问题讨论】:

您应该将此作为两个单独的问题提出,因为 Android 和 ios 之间的解决方案将大不相同。 这需要是两个独立的问题。一个用于 Android/Java,另一个用于 iOS/Swift,因为它会有两个完全不同的答案,由不同的人解决。 还提供minimal reproducible example 并清楚地显示导致错误的行。听起来第一步是在考虑如何在 TextView 中使用 HTML 之前解决 NPE。 你可以尝试在最后一行使用text[0]并告诉我结果吗? 正如我之前所说,您需要展示一个最小的工作示例,以便我们为您提供帮助。您在此处显示的代码缺少几个变量声明。也没有类或方法。我们需要这些详细信息来理解您的代码,并能够在没有大量猜测工作的情况下为您指明正确的方向。 【参考方案1】:

无需创建单独的文本视图。您可以使用SpannableString 来实现您的目标。以下是以不同方式更改字符串样式的示例代码。您只需要计算字符串内的开始和结束索引。

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);

【讨论】:

我如何使用它来使某些字符串变为粗体,而其余的则正常? styledString.setSpan(new StyleSpan(Typeface.BOLD), 7, 11, 0);【参考方案2】:

您可以使用文本跨度。

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

设置文本时,直接传递builder,不调用toString()

【讨论】:

以上是关于如何以编程方式在Android中编写部分字符串粗体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中以编程方式查找TextView的文本区域(高度/宽度)

Android - 粗体标签似乎不会影响 Strings.xml 中的 URL 文本 [重复]

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

如何以编程方式在android中添加自定义帐户?

Android - 如何在小米设备中以编程方式启用自动启动选项?

如何在android中以编程方式创建多个列表