【问题标题】:Dynamically Displaying Text with TextView (Android)使用 TextView 动态显示文本 (Android)
【发布时间】:2011-01-19 04:36:55
【问题描述】:

基本上我想在我的 Android 应用程序中做的是使用 TextView 一次显示两个不同的文本。所以在代码中,我希望能够做这样的事情:

    LinearLayout ll = new LinearLayout(this);
    TextView text = new TextView(this);
    text.setTextColor(0xFF000000);
    text.setGravity(Gravity.CENTER_HORIZONTAL);
    text.setTextSize(20f);
    text.setText("Text1");
    text.setTextSize(14f);
    text.setColor(0xFF0000FF);
    text.setText("\nText2");
    ll.addView(text);

为了澄清,我试图只使用一个 TextView 一次显示一个黑色的“Text1”和一个蓝色的“Text2”。显然,使用上面的代码是行不通的。我考虑过使用第二个 TextView ,但这对我来说似乎是浪费精力和记忆。我相信这里的聪明人能想出最好的解决方案。

非常感谢您的宝贵时间和帮助。

【问题讨论】:

    标签: java android android-layout textview


    【解决方案1】:

    有两种选择。

    一个是

    Spannable

    其他的是

    fromHtml (String source)

    这样你就可以得到你想要的输出。

    【讨论】:

    • 简单直接。正是我需要的。谢谢。
    【解决方案2】:

    我认为使用当前版本的代码,您只能看到最新的文本(Text2)。 如果您想对两个文本有多种外观和感觉,我建议使用 2 个单独的 TextView。它会增加更多的灵活性。

    如果您以后不打算更改此 UI 代码,那么您可以考虑在 setText() 调用中使用 Html.toHtml()。

    【讨论】:

    • 正如我在问题中所说的,我不想使用两个 TextView。这是一个非常浪费和糟糕的解决方案。我经常在嵌入式平台上编写 RISC(主要是 PPC 和 ARM)程序集,这可能归因于我对这个主题的强烈感受。我真的不在乎我的代码是否“丑陋”,只要它是有效的(在我看来,我认为使用更少的 TextViews 会更灵活)。但同样感谢您的回复。
    【解决方案3】:

    看来问题出在:

    LinearLayout.addView(text);
    

    您正在尝试将视图添加到 LinearLayout,但该布局不存在(在当前活动中)。您需要将 TextView 添加到您正在使用的 .xml 中定义的布局中。假设您在 xml 文件“activity1.xml”中有一个 ID 为“linearlayout01”的 LinearLayout,您将执行以下操作:

    setContentView(R.layout.activity1);
    
    // Create and adjust TextView text
    
    ...
    
    LinearLayout layout = (LinearLayout) findViewById(R.id.linearlayout01);
    layout.addView(text);
    

    【讨论】:

    • 不,你完全误解了我的意思。这可能是我的错;我是通用的,以保持我的代码大小。我会修改问题。假设 LinearLayout 确实存在,然后再看我的问题。我的问题不是没有出现文本,我的问题是动态更改文本。
    【解决方案4】:

    一旦将View 添加到ViewGroup 中,而LinearLayout 是其后代,则无需读取它即可更新其显示。如果您对需要更改其显示的视图进行任何更改,它将通过在适当的情况下调用View#invalidateView#requestLayout 来处理有关所需重绘或重新布局的所有适当通知。

    此外,由于所有 UI 更改都在同一个线程上处理,因此您无需担心调用会更新 UI 的多个方法。这是因为两个原因,首先,在您的代码完成之前不会执行重绘,其次,android 内置了将多个无效调用合并为一个的优化。

    所以,您唯一需要担心的是正确引用您的 TextView 实例,然后您可以调用它所需的所有方法,使其显示您希望的内容。

    由于您是手动创建 Views 而不是从 xml 中创建,因此您需要通过调用 Activity#setContentView 将您的根 ViewGroup 添加到 Activity

    编辑:

    那么您将需要了解SpannableStringSpannableStringBuilder。这里有一些非常简短的文档:Selecting, Highlighting, or Styling Portions of Text

    【讨论】:

    • 不,你不懂我。这可能是我的错,我会尽力解决这个问题。我想在一个渲染中显示两种不同类型的文本,而不是在多个渲染中。使用我上面发布的代码,只呈现“Text2”。我希望能够同时显示“Text1”和“Text2”
    • 关于 SpannableString 的信息应该是你要找的。​​span>
    • 如果您有任何参考资料可以提供给我,我将不胜感激。谢谢。
    【解决方案5】:

    你打算什么时候更新textview?如果是单击按钮,则获取对textview 的引用,并在 onClickListener() 中更新文本、颜色等,无论您想做什么。

    看了你的其他cmets,我觉得SpannableString就是你要找的东西

    【讨论】:

    • 你根本不懂我的问题。对不起,一定是我的错。我不是试图绘制文本,然后在事件发生后更改它。这很容易 ;) 我试图在同一个 TextView 中一次呈现两个不同的文本。
    • 在看到你的其他 cmets 之后,我认为 SpannableString 就是你要找的。示例参考developer.android.com/resources/samples/ApiDemos/src/com/…
    • 相反,你总是使用 2 个文本视图来完成你的任务 :)
    • 感谢您的链接。如果我没有很快得到任何人的更好回应,我会给你最好的答案。这可能是因为我的根源是 C/C++ 编程,但不幸的是 SpannableString 看起来也不是一个特别优雅的解决方案。正如我在发布问题后所说的那样,额外的 TextView 似乎非常浪费,因此我想避免这种解决方案。
    • 您可以做的另一件事是使用 HTML 标记格式化您的字符串,然后使用 Html.fromHtml(String)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2014-05-15
    相关资源
    最近更新 更多