使用内部存储中的.png设置按钮后台资源

时间:2013-11-15 20:49:15

标签: android user-interface deprecated

我有一个按钮,我想设置从内部存储使用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?

感谢。

***编辑 - 好的,这是有效的。只是错过了代码中其他地方的一小部分有同样的问题。但是,使用弃用方法真的是唯一的方法吗?

2 个答案:

答案 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()));
}