在非活动类中使用getResources()

ssk*_*ssk 117 android android-context

我试图在非活动类中使用getResources方法.如何获取对"resources"对象的引用,以便我可以访问存储在resources文件夹下的xml文件?

例:

XmlPullParser xpp = getResources().getXml(R.xml.samplexml);
Run Code Online (Sandbox Code Playgroud)

Luc*_*uke 142

您必须将context对象传递给它.要么this,如果你有在activty到类的引用,或getApplicationContext()

public class MyActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        RegularClass regularClass = new RegularClass(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在构造函数中使用它(或将它设置为实例变量):

public class RegularClass(){
    private Context context;

    public RegularClass(Context current){
        this.context = current;
    }

    public findResource(){
        context.getResources().getXml(R.xml.samplexml);
    }
}
Run Code Online (Sandbox Code Playgroud)

构造函数接受Context的参数

  • 作为一个基本的经验法则,但我觉得这有点误导.`Context`对象是讨厌的,因为如果它是应用程序范围或活动范围,它不是立即显而易见的.当您提供错误的内存时,会发生内存泄漏(和崩溃).例如,将`Activity`提供给需要`Context`的静态对象,并且当`Activity`导致在onDestroy之后持久存在`Activity`时,不会销毁所述对象,因为它不能由于其他而被GCed静态对象.所以,是的,它可能是危险的,但是知道*为什么*这是危险的我觉得这里很重要. (26认同)
  • 在Android中传递`Context`对象通常不是一个好主意.它可能导致内存泄漏. (5认同)
  • ^ Dororo,这是我读过的最重要的评论之一。很少讨论是否适当使用上下文。因此,我感到自己遇到了许多无法解释的错误! (2认同)

Jas*_*sby 32

传递Context物体不是一个好主意.这通常会导致内存泄漏.我的建议是你不要这样做.我已经制作了许多Android应用程序,而无需将上下文传递给应用程序中的非活动类.一个更好的想法是获取您在Activityor中所需的资源Fragment,并在另一个类中保留它.然后,您可以在应用程序的任何其他类中使用该类来访问资源,而无需传递Context对象.

  • @Peter是的,有些类要求您传入上下文对象.因此,最好只尝试在活动或片段中使用SqLiteOpenHelper等类,这样就不必传递上下文对象.如果它不可避免,只需确保在完成后将上下文对象的引用设置为null,以帮助降低内存泄漏的风险. (2认同)

Mah*_*rai 12

还有一种方法可以不创建对象.检查参考.谢谢@cristian.下面我添加上面引用中提到的步骤.对我来说,我不喜欢为那个和访问创建一个对象.所以我尝试在getResources()不创建对象的情况下访问它.我找到了这篇文章.所以我想把它添加为答案.

按照步骤通过对象访问getResources()非活动类without passing a context.

  • Application例如,创建一个子类public class App extends Application {.请参阅步骤旁边的代码.
  • 将标记的android:name属性设置为指向新类,例如<application>AndroidManifest.xmlandroid:name=".App"
  • onCreate()app实例的方法中,将上下文(例如this)保存到名为的静态字段,app并创建一个返回此字段的静态方法,例如getContext().
  • 现在您可以使用:App.getContext()只要您想获取上下文,然后我们就可以使用App.getContext().getResources()从资源中获取值.

它应该是这样的:

public class App extends Application{

    private static Context mContext;

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

    public static Context getContext(){
        return mContext;
    }
}
Run Code Online (Sandbox Code Playgroud)


Kri*_*ian 7

你有权进入Context吗?或者很可能你可以访问它getApplicationContext()


liz*_*ala 5

这是我的答案:

public class WigetControl {
private Resources res;

public WigetControl(Resources res) 
{
    this.res = res;
}

public void setButtonDisable(Button mButton)
{
    mButton.setBackgroundColor(res.getColor(R.color.loginbutton_unclickable));
    mButton.setEnabled(false);
}
Run Code Online (Sandbox Code Playgroud)

}

并且通话可以是这样的:

        WigetControl control = new WigetControl(getResources());
        control.setButtonDisable(btNext);
Run Code Online (Sandbox Code Playgroud)