【问题标题】:Implementation of getResources() AndroidgetResources() Android 的实现
【发布时间】:2013-05-31 03:32:27
【问题描述】:

我刚开始学习android编程,我对getResources()方法产生了疑问。 我注意到,当我创建资源对象时,我所要做的就是:
Resources res = getResources();
第一个疑惑是为什么我必须这样做,我不能使用java关键字new?我不应该做这样的事情:
Resources res = new Resources();
第二个疑问如下:在我的文件顶部,我导入了 Resources 类。
import android.content.res.Resources;
现在我阅读了 android api,它说 getResources() 是一个公共抽象方法,如果它是抽象的,哪个类实现它?如果它没有被声明为静态,我怎么能简单地调用它输入 getResources() ?

【问题讨论】:

    标签: java android api getresource


    【解决方案1】:

    getResources 实际上是您可以从 Context 访问的方法。所以你真的可以把它想象成:

    context.getResources()
    

    在这种情况下,您的 Activity 类就是您的上下文,这就是为什么您可以使用以下语法调用它:

    getResources()
    

    http://developer.android.com/reference/android/content/Context.html#getResources%28%29

    来自那些文档:

    有关应用程序环境的全局信息的接口。这 是一个抽象类,其实现由 Android 提供 系统。它允许访问特定于应用程序的资源和 类,以及对应用程序级操作的向上调用,例如 发起活动、广播和接收意图等。

    【讨论】:

    • 编辑太晚了。无论如何,答案已更新为该答案。感谢您的澄清!
    【解决方案2】:

    您的活动扩展了android.app.Activity 类,而后者又扩展了android.content.Context 类(类层次结构的三个级别)。 Context 类声明了抽象方法 getResources(),这意味着您的活动子类继承了该方法,您可以从您的 onCreate() 方法中调用它(例如)。

    getResources() 方法在类Context 中声明为抽象,但类层次结构中的一个中间类 (android.view.ContextThemeWrapper) 提供了该方法的实现。

    这也意味着创建Resources 对象不是您的责任;它是由框架完成的。

    【讨论】:

    • 嗨@devconsole。我查看了 ContextThemeWrapper.java 源码,并没有找到方法getResources() 的实现。只有被覆盖的方法getResources() 调用super.getResources()。你知道另一个实现getResources() 的类吗?谢谢。
    • 如果您有兴趣,请参阅我的问题here
    • @janzoner 重点是ContextThemeWrapper 提供了getResources() 的实现,Activity 继承了该实现。这回答了最初的问题。那我的回答有什么问题?
    • @janzoner 是的,它调用了super.getResources(),后者调用了ContextWrapper 的实现,而后者又调用了mBase.getResources()。我想它最终会导致ContextImpl 课程,但这不是公共课程。它是 SDK 的实现细节。见source code at github
    • 很抱歉,您对原始问题的回答是可以的。我心里有我自己的问题,你的回答没有提供我需要的信息。但正如我所说,你的答案是正确的。再次抱歉。为答案+1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2014-09-14
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多