如何以编程方式在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 中以编程方式获取设备名称和型号?