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
的参数
Jas*_*sby 32
传递Context
物体不是一个好主意.这通常会导致内存泄漏.我的建议是你不要这样做.我已经制作了许多Android应用程序,而无需将上下文传递给应用程序中的非活动类.一个更好的想法是获取您在Activity
or中所需的资源Fragment
,并在另一个类中保留它.然后,您可以在应用程序的任何其他类中使用该类来访问资源,而无需传递Context
对象.
Mah*_*rai 12
还有一种方法可以不创建对象.检查参考.谢谢@cristian.下面我添加上面引用中提到的步骤.对我来说,我不喜欢为那个和访问创建一个对象.所以我尝试在getResources()
不创建对象的情况下访问它.我找到了这篇文章.所以我想把它添加为答案.
按照步骤通过对象访问getResources()
非活动类without passing a context
.
Application
例如,创建一个子类public class App extends Application {
.请参阅步骤旁边的代码.android:name
属性设置为指向新类,例如<application>
AndroidManifest.xml
android: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)
这是我的答案:
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)