簡體   English   中英

從非活動類獲取資源

[英]Getting resources from non-activity classes

我有一個特殊的類,用於保存靜態信息並根據特殊情況進行計算。 這是一個特殊的自定義類,它不會擴展活動或android環境的任何部分。

因為此類從未真正實例化 ,所以通常在static級別上對其進行引用。 對於我來說,這仍然很重要,因為我擁有許多對應用程序流程至關重要的static enums

問題出在這里:因為該類沒有延長android活動的生命周期,所以我在引用應用程序資源文件中的任何字符串值時遇到了麻煩。 (我將字符串存儲在自定義XML文件中作為特殊資源)

這是所有內容的外觀:

枚舉的自定義類:

public class CreepIDs {

    public static Context context = App.getContext();

    public static enum CreepId {

        ROBODEE(0, resourceString(R.creeps.robodee));

        public final int id;
        public final String name;

        CreepId(int id, String name){
            this.id = id;
            this.name = name;
        };
    };

    public static String resourceString(int id){
        return context.getResources().getString(id);
    }
}

應用程序類別擴展應用程序:

public class App  extends Application{

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
    }

    public static Context getContext(){
        return mContext;
    }
}

到目前為止,我已經使用調試功能逐步完成了該應用程序,並且App.getContext()始終返回 一個值為 null Context 我不知道為什么。 我需要能夠從不擴展android生命周期任何部分的類中引用 R.creeps.robodee

我將通過構造函數傳遞上下文,但是由於CreepIdstatic enum CreepIDs實際上並未實例化。 我僅從主要活動中引用它。

您認為這里最好的解決方案是什么?

這樣雖然不漂亮,但是我找到了解決方案。 在Main活動的onCreate (此信息現在甚至被使用的唯一位置)中,我放置了以下代碼:

CreepIDs.context = getApplicationContext();

由於context無論如何都是static public ,因此我會在應用啟動時直接為其分配一個值。 我只需要上下文,因此我可以調用資源,並且它不會用於其他任何事情,因此我認為這對我來說根本不是問題。

最后,使用特殊的App類對我不起作用。

感謝大家的協助。

嘗試這個:

public class App extends Application {

    private static App INSTANCE;

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

    public static App getInstance() {
        return INSTANCE;
    }

}

對我有用。

基於Andrey的答案:

public class App extends Application {

private static App INSTANCE;

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

public static App getInstance() {
    return INSTANCE;
}

}

然后,在CreepsID中:

public class CreepIDs {

public static Context context = App.getInstance();

public static enum CreepId {

    ROBODEE(0, resourceString(R.creeps.robodee));

    public final int id;
    public final String name;

    CreepId(int id, String name){
        this.id = id;
        this.name = name;
    };
};

public static String resourceString(int id){
    return context.getResources().getString(id);
}

}

您正在調用靜態方法來獲取App的上下文,從而使您的靜態類可以訪問Activity的資源。

該鏈接為我解決了所有問題: 如何從靜態上下文中獲取資源內容?

我只是意識到我應該創建一個全新的類,除了Cristians回答中的代碼外,別無其他。 記住要修改清單!

祝好運:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM