【问题标题】:getContext().getResources() from a class which doesn't inherit from ApplicationgetContext().getResources() 来自不继承自 Application 的类
【发布时间】:2019-10-31 03:45:47
【问题描述】:

我想从类中的函数返回一个位图,大多数时候我会返回一个生成的图像,这很好,但在某些情况下我想从资源中返回文件。

This answerBitmapFactory.decodeResource and drawable* folders 问题告诉我使用

Resources res = getContext().getResources();
int id = R.drawable.image; 
Bitmap b = BitmapFactory.decodeResource(res, id);

我翻译成的

val res = getContext().getResources()
val errorbitmap:Bitmap = BitmapFactory.decodeResource( res,  R.drawable.pm5544)

但当然有编译错误:

未解决的参考:getContext

这引出了我的问题:

  • 我需要在什么对象上调用getContext() 或解决真正的问题:
  • 我应该使用其他 API 来从我的资源中获取位图吗?

【问题讨论】:

  • 尝试使用资源 res = getResources();或资源 res = getApplicationContext().getResources();
  • 显然我的班级都看不到这些
  • 您可以发布您的活动代码吗?
  • 那将是我无法分享的大部分无关代码,但我的主要活动是class MainActivity : AppCompatActivity() ,它将这个类创建为object: {...}
  • 为什么不简单地在参数中传递上下文?

标签: android kotlin


【解决方案1】:

如果您从MainActivity 运行以下代码,您将可以访问resources

val res = resources
val id = R.drawable.image
val b = BitmapFactory.decodeResource(res, id)

为了能够在您的对象中使用它,您必须将资源作为参数传递,或者如果您只需要一个图像,则将其作为参数传递。

【讨论】:

  • val res = resources 可从MainActivity 获得,但不能从对象获得
  • 你能告诉我你在哪里使用它,即在哪个类和哪个函数中?
  • 我使用参数建议对您的答案进行了重大修改,这就是我决定实现此功能的方式。
【解决方案2】:

我需要在什么对象上调用 getContext()?

使用Application 上下文。您可以在应用程序的任何位置使用应用程序上下文。

创建自己的Application

public class AppApplication extends Application {

    private static AppApplication instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static AppApplication getInstance() {
        return instance;
    }
}

并以这种方式访问​​应用程序上下文:

Context appContext = AppApplication.getInstance().getApplicationContext();

现在使用appContext 访问您的资源

Kotlin 版本:

class AppApplication :Application(){

    companion object{
        private lateinit var instance:AppApplication
        fun getInstance():AppApplication{
            return instance
        }
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
    }
}

访问Application上下文

val applicationContext = AppApplication.getInstance().applicationContext

确保在Manifest 中添加自定义AppApplication

<application
    android:name=".AppApplication"
    ............
</application>

使用应用程序上下文是安全的,因为没有 ActivityFragment 生命周期问题

【讨论】:

  • 这是什么语言?爪哇?
  • "这是什么语言?" -> 是的,它是 Java
  • 感谢您的澄清。很好地解释了我需要做什么才能完成看似很小的任务。
猜你喜欢
  • 1970-01-01
  • 2022-11-16
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
相关资源
最近更新 更多