API级别23中不推荐使用setTextAppearance

Ali*_*ani 45 android deprecated

public void setTextAppearance(Context context,int resId)在API级别1中添加
此方法在API级别23中已弃用.请改用setTextAppearance(int).

我的问题:为何被弃用?为什么它不再需要Context了?最重要的是,如何使用setTextAppearance(int resId)旧版本?

Rus*_*amG 103

您可以使用TextViewCompatsupport/androidX库:

    import android.support.v4.widget.TextViewCompat // for support-library
    import androidx.core.widget.TextViewCompat      // for androidX library

    // ...

    TextViewCompat.setTextAppearance(view, resId)
Run Code Online (Sandbox Code Playgroud)

在内部,它从view.getContext()API <23上的view()获取上下文.

TextViewCompat的源代码

TextView的源代码(API23)

  • 我正在使用 `TextView(context)` 创建 TextView,我尝试切换到 TextViewCompat,它没有公共构造函数,而且我无法强制转换新创建的 TextView 并以这种方式使用它。如果您以编程方式创建文本视图,如何使用 (androidx) TextViewCompat? (2认同)

Hen*_*nry 48

  1. 如何使用setTextAppearance(int resId)旧版本?

    像这样使用它:

    if (Build.VERSION.SDK_INT < 23) {
        super.setTextAppearance(context, resId);
    } else {
        super.setTextAppearance(resId);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    有关详细信息:https://stackoverflow.com/a/33393762/4747587

  2. 为什么它被弃用了?为什么它不再需要Context?

    它被弃用的原因是没有必要通过context.它使用由View.提供的默认上下文.看下面的源代码.那应该解释一下.

    public void setTextAppearance(@StyleRes int resId) {
         setTextAppearance(mContext, resId);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    mContext这里的定义View类.所以你不需要再传递给Context这个方法了.该TextView会使用在它的创作提供给它的上下文.这更有意义.

UPDATE

此功能作为支持库的一部分添加.所以不要TextView使用TextViewCompat[文档].还有其他课程,如ImageViewCompat.

  • 这很糟糕,为什么他们没有将setTextAppearance作为ContextCompat类的一部分添加?现在我们必须包装所有的setTextAppearance方法,或者在我们的客户端代码中冒着被弃用的代码失败的风险. (19认同)
  • @worked看到我的回答:http://stackoverflow.com/a/37028325/2613692他们确实在发布此问题之前将方法添加到TextViewCompat类. (9认同)