安卓 - 使用整数值0作为R.drawable的“null”等价物

3

我正在使用一种直观但可能不规范的快捷方式,我想知道它是否会引起问题,是否是不好的形式,或者是否有不同的更被接受的方法。

这个快捷方式是:在一个期望一个R.drawable常量的int的函数中,我有时使用0作为传递“null”的等效方式。

下面是我如何使用这个模板:

int someDrawable = isSomeCondition() ? R.drawable.somedrawable_identifier : 0; mHandler.post(new UpdateSomeUI(someDrawable));

//and, elsewhere in the application,
private class UpdateSomeUI implements Runnable {
    private final int someDrawable;

    public UpdateSomeUI(int someDrawable) {
        this.someDrawable = someDrawable;
    }

    public void run() {
        mSomeImageView.setImageResource(someDrawable);
    }
}

看起来它能够正常工作 - 也就是说,到目前为止它一直在按照我的意愿运行,并且我还没有观察到任何不良影响,比如崩溃或者在设备内部创建量子奇点。

这样做安全吗? 这样做是否合适? 我已经尝试了 S'dTFW 来获取一个在这种情况下被认为是“null”的官方整数值,但是没有成功。有人知道是否存在这样的值吗?

编辑: 我意识到标签“r”并不是我想要的那个。标签“android.R”似乎不存在。所以我现在将删除这个标签。


接受了一个答案后,我似乎无法回答自己的问题。因此,我将其留作评论。查看ImageView源代码,似乎设置位图或其他可绘制对象会将mResource值设置为零。此外,每当mResource值被显著使用时,都会用“!=0”进行保护检查。这相当强烈地支持了0是一个特殊值的观点;没有实际资源会将'0'作为其分配的值。这使我谨慎地相信使用0作为空值是安全的。但仍然是不好的形式,请参见下面接受的答案。 - Cephron
2个回答

10

在安卓文档的资源ID子节常量中发现了这个,希望能有所帮助。

Resource ID > Constants

常量 ID_NULL 29级API中添加 静态val ID_NULL: Int 空资源ID。这表示找不到资源或者在XML中将值设置为@null时系统返回的无效资源ID。

值:0


很好,即使问题已经有了标记答案,你还是回答了。很好的观点! - Sreeram Nair
1
希望那不是讽刺哈哈..只是想附上那个链接,因为没有其他人这样做。 - Arshdeep Singh
在 API 级别 29 之前,0 是否保证是无效的资源 ID? - zomega

4

没有代表“null”的资源,如果传入无效的资源id,则会抛出异常并在内部处理(调用getDrawable(0)时)。正确的做法是仅在实际存在有效可绘制对象时才调用UpdateSomeUI(someDrawable)

例如:

//in a method somewhere: 
if(isSomeCondition()) {
    mHandler.post(new UpdateSomeUI(R.drawable.somedrawable_identifier));
}

那样做有什么问题吗?

区别在于,当isSomeCondition()不再为真时,我希望图像实际上消失。如果我使用位图,我将调用setImageBitmap(null)以使图像从视图中消失;我试图使用setImageResource(0)来实现相同的效果。 - Cephron
1
我认为正确的做法是传递View.VISIBLE或View.GONE并调用setVisibility。 - Cephron
那为什么不隐藏ImageView呢? - Robby Pond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接