【问题标题】:How to change TextView Color Programmatically如何以编程方式更改 TextView 颜色
【发布时间】:2016-07-03 17:27:18
【问题描述】:

我被这个看似简单的任务难住了。

我只想将textview 的颜色和linearlayout 的背景颜色更改为我的colors.xml 资源文件中设置的颜色。

我试过了:

myTextView.SetTextColor(this.Resources.GetColor(Resource.Color.myColor));

但这已被弃用。

然后我尝试了:

myTextView.SetTextColor(ContextCompat.GetColor(context, Resource.Color.myColor));

但是 ContextCompat.GetColor() 返回一个 int 而不是 Android.Graphics.Color 所以不会编译。

然后我尝试将颜色设置为 style 的一部分:

  <style name="myColorStyle">
    <item name="android:textColor">
      @color/myColor
    </item>
...
  </style>

并首先使用设置它

myTextView.SetTextAppearance(this, Resource.Style.myColorStyle);

但这也被弃用了

我试过了:

myTextView.SetTextAppearance(Resource.Style.myColorStyle);

但这会引发异常:

Java.Lang.NoSuchMethodError: 没有非静态方法“Landroid/widget/TextView;.setTextAppearance(I)V”

这个简单的任务是如何完成的?

我正在使用 Xamarin 和 Visual Studio 编写 C#。

【问题讨论】:

  • 你有必要从资源中获取颜色吗?
  • 你试过myTextView.setTextColor(Color.parseColor("#000"));或myTextView.setTextColor(Color.parseColor("red"));
  • textView.setTextColor(getResources().getColor(R.color.errorColor));
  • 我不确定 1-1 Xamarin 如何镜像 Android API。但是 resources.getColor(int) 仅在 API23 上被弃用,以支持可以使用 Resource.Theme 的版本。这意味着两件事:1)您可以忽略弃用; 2)您可以使用其他方法为null:resource.getColor(Resource.color.myColor, null);
  • 使用新的Android.Graphics.Color(ContextCompat.GetColor(this, Resource.Color.red));不要忘记 constructor new Android.Graphics.Color ()

标签: c# android visual-studio xamarin


【解决方案1】:

在 2017 年,这在某种程度上是通过资源 id 获取颜色的正确方法,尽管它看起来非常复杂:

new Android.Graphics.Color (ContextCompat.GetColor (this, Resource.Color.bb_orange));

每: https://forums.xamarin.com/discussion/54193/res-getcolor-is-deprecated

【讨论】:

    【解决方案2】:

    不需要这么复杂,直接用

    myTextView.setTextColor(Color.parseColor("#000"));
    

    或

     myTextView.setTextColor(Color.parseColor("red"));
    

    或

    myTextView.setTextColor(getResources().getColor(R.color.YOURCOLOR));
    

    【讨论】:

    • 谢谢,我目前正在使用您的第一个建议,尽管在代码中复制 XML 资源感觉不对! (您的第三个建议是针对 Java,但我在 C# 中使用 Xamarin,它是标记为弃用的等效方法)
    • 如果它已被弃用,那么为什么不使用ContextCompat.getColor(context, R.color.YOURCOLOR);
    • 在顶部查看我的问题。 ContextCompat.getColor() 返回一个 int 但 setTextColor() 需要一个 Color(这是 Resources.GetColor() 返回的)
    • setTextColor() 也接受int。见doc]
    • myTextView.setTextColor(Color.parseColor("#000"));这将引发错误。它只接受#rrggbb 格式。
    【解决方案3】:

    很简单,如果你想跳过 xml。

      myTextView.SetTextColor(Android.Graphics.Color.Red);
    

    也适用于设置文本视图的背景颜色。

    myTextView.SetBackgroundColor(Android.Graphics.Color.White);
    

    【讨论】:

      【解决方案4】:

      更新

      我一开始没有注意到,但我看到你已经尝试过这个解决方案。你用的是什么版本?在我看来,它并没有被弃用。

       textView.SetTextColor(Resources.GetColor(Resource.Color.red));
      

      在资源/values/colors.xml 中

      <?xml version="1.0" encoding="utf-8" ?>
      <resources>
        <color name="red">#ff0000</color>
        <color name="blue">#0000ff</color>
      </resources>
      

      Xamarin Resource.Color

      【讨论】:

      • 我正在使用 Visual Studio 2015,带有 Xamarin 4.0.1.145 和 Xamarin.Android 6.0.2.1
      • 这个版本我不能试试,但是你可以试试:试试用Get ColorStateList代替GetColor ContextCompat.GetColor()返回什么值?它可以是 int id forTemp Id 资源吗?或者也许 RGB 颜色表示为 int 而不是 RGB?
      猜你喜欢
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 2015-12-06
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多