我有一个按钮,我想设置从内部存储使用png文件的背景。对于android api 16及以上版本,这很好用:
filePath = getActivity().getFileStreamPath(colorCodes.get(i-1));
temp.setBackground(Drawable.createFromPath(filePath.toString()));
在4.0.4的Android平板电脑上运行时,此部件会因为nosuchmethod错误(setBackground)而崩溃应用程序。经过一番研究后,我发现setBackground仅适用于api 16+。在浏览了SO和其他一些地方后,看起来我需要使用setBackgroundDrawable(不建议使用)或setBackgroundResource。我试过这个:
filePath = getActivity().getFileStreamPath(colorCodes.get(i-1));
if (android.os.Build.VERSION.SDK_INT < 16) {
temp.setBackgroundDrawable(Drawable.createFromPath(filePath.toString()));
} else {
temp.setBackground(Drawable.createFromPath(filePath.toString()));
}
当它注销时,它显示setBackgroundDrawable正在运行而不是setBackground,但是我得到了相同的nosuchmethod错误(setBackground)。
另一个选项是setBackgroundResource,但是它接受一个int而不是一个drawable。我可以为此目的从drawable转换为int吗?
我可以在此处将按钮的背景设置为API的内部存储中的文件&lt; 16?
感谢。
***编辑 - 好的,这是有效的。只是错过了代码中其他地方的一小部分有同样的问题。但是,使用弃用方法真的是唯一的方法吗?
答案 0 :(得分:1)
我不太确定这是否是实现这一目标的唯一途径,但在我看来这是正确的。因为@Deprecated注释定义了要被取代的方法(在大多数情况下),它自动暗示你可以(我甚至会说应该)使用它来处理作为此方法的目标版本的旧版本。
答案 1 :(得分:1)
弃用是应用于计算机软件功能的状态, 通常,特征或实践表明应该避免 因为它被取代了。该术语有时也用于a 允许但不再允许的特征,设计或实践 推荐用于其他领域,如硬件设计或合规性 建筑规范。 (source link)
现在我们可以回答你的问题了。
在API级别16之前,有一个名为setBackgroundDrawable
的方法。 API级别16之后,谷歌决定为同一目的编写新方法setBackground
,并建议我们使用新方法。 (可以通过谷歌搜索找到原因。)
您可以对所有api级别使用setBackgroundDrawable
方法。对此没有任何限制。但是在API级别16之后建议使用新方法setBackground
。
但是,对于在API级别16或更高级别上运行的设备,您只能使用setBackground
方法。因此,如果您只在代码中实施setBackground
方法,则对于运行低于API级别16的设备,您将获得MethodNotFoundException
。
总结;这是一个最佳实践(对我来说是必须的)使用新方法然后弃用支持api版本检查的方法,如;
if (android.os.Build.VERSION.SDK_INT < 16) {
temp.setBackgroundDrawable(Drawable.createFromPath(filePath.toString()));
} else {
temp.setBackground(Drawable.createFromPath(filePath.toString()));
}