setTextAppearance deprecated in API level 23
Solution 1:
You can use TextViewCompat
from the support/androidX library:
import android.support.v4.widget.TextViewCompat // for support-library
import androidx.core.widget.TextViewCompat // for androidX library
// ...
TextViewCompat.setTextAppearance(view, resId)
Internally it gets the context from the view (view.getContext()
) on API < 23.
Source for TextViewCompat
Source for TextView (API23)
Solution 2:
-
how to use
setTextAppearance(int resId)
for older versions?Use it like this:
if (Build.VERSION.SDK_INT < 23) { super.setTextAppearance(context, resId); } else { super.setTextAppearance(resId); }
For more info: https://stackoverflow.com/a/33393762/4747587
-
Why it's been deprecated? Why it doesn't need Context anymore?
The Reason why it is deprecated is there is no need to pass a
context
. It uses the default context provided by theView
. Look at the source code below. That should explain it.public void setTextAppearance(@StyleRes int resId) { setTextAppearance(mContext, resId); }
The
mContext
here is defined in theView
class. So you need not pass aContext
to this method anymore. TheTextView
will use the context provided to it during it's creation. That makes more sense.
UPDATE
This functionality is added as part of the Support Library. So instead of TextView
, use TextViewCompat
[documentation]. There are also other classes introduced along with this, like ImageViewCompat
.
Solution 3:
The above answer is correct - here's another way too. In Kotlin I wrote an extension which makes life easier if you do support SDK 23
and below as well as above.
fun TextView.setAppearance(context: Context, res: Int) {
if (Build.VERSION.SDK_INT < 23) {
setTextAppearance(context, res)
} else {
setTextAppearance(res)
}
}