在非活动类中使用getResources()

我正在尝试在非活动类中使用getResources方法。 我如何获得对“资源”对象的引用,以便我可以访问资源文件夹下存储的XML文件?

例:

XmlPullParser xpp = getResources().getXml(R.xml.samplexml); 

你将不得不传递一个context对象。 如果你有一个活动的类的引用,或者getApplicationContext()

 public class MyActivity extends Activity { public void onCreate(Bundle savedInstanceState) { RegularClass regularClass = new RegularClass(this); } } 

然后你可以在构造函数中使用它(或者将其设置为一个实例variables):

 public class RegularClass(){ private Context context; public RegularClass(Context current){ this.context = current; } public findResource(){ context.getResources().getXml(R.xml.samplexml); } } 

构造函数接受Context作为参数

传递Context对象不是一个好主意。 这往往会导致内存泄漏。 我的build议是,你不这样做。 我做了很多Android应用程序,而不必将应用程序的上下文传递给非活动类。 一个更好的想法是在ActivityFragment获取需要访问的资源,并在另一个类中保存它。 然后,您可以在应用中的任何其他类中使用该类来访问资源,而不必传递Context对象。

还有一种方法,也没有创build一个对象。 检查参考 。 感谢@ cristian。 下面我添加上面提到的步骤。 对我而言,我不喜欢为这个和访问创build一个对象。 所以我试图访问getResources()而不创build一个对象。 我发现这个职位。 所以我想添加它作为答案。

按照以下步骤访问非活动类中的getResources()without passing a context对象without passing a context

  • 创buildApplication的子类,例如public class App extends Application { 。 请参阅步骤旁边的代码。
  • AndroidManifest.xml设置你的<application>标签的android:name属性指向你的新类,例如android:name=".App"
  • 在应用程序实例的onCreate()方法中,将上下文(例如this )保存到名为app的静态字段中,并创build一个返回此字段的静态方法,例如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; } } 

你有权访问Context吗? 或者很可能你可以通过getApplicationContext()来访问它

这是我的答案:

 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); } 

}

这个电话可以是这样的:

  WigetControl control = new WigetControl(getResources()); control.setButtonDisable(btNext); 

我们可以使用上下文Context context = parent.getContext(); 父母是ViewGroup的地方。

这可以通过使用

 context.getResources().getXml(R.xml.samplexml); 

以及没有必要通过的背景下,做所有这些…只需做到这一点

 Context context = parent.getContext(); 

编辑:父母是ViewGroup

这总是适合我:

 import android.app.Activity; import android.content.Context; public class yourClass { Context ctx; public yourClass (Handler handler, Context context) { super(handler); ctx = context; } //Use context (ctx) in your code like this: XmlPullParser xpp = ctx.getResources().getXml(R.xml.samplexml); //OR final Intent intent = new Intent(ctx, MainActivity.class); //OR NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); //ETC... } 

不涉及这个问题,但使用片段访问系统资源/活动的例子是这样的:

 public boolean onQueryTextChange(String newText) { Activity activity = getActivity(); Context context = activity.getApplicationContext(); returnSomething(newText); return false; } View customerInfo = getActivity().getLayoutInflater().inflate(R.layout.main_layout_items, itemsLayout, false); itemsLayout.addView(customerInfo); 

在Udacity的Basic ANdroid课程的导游应用程序中,我使用了Fragments的概念。 我被卡住了一段时间,遇到难以访问string,XML文件中描述的一些string资源。 终于有了解决办法。

这是主要的活动类

包com.example.android.tourguidekolkata;

 import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { //lines of code //lines of code //lines of code YourClass adapter = new YourClass(getSupportFragmentManager(), getApplicationContext()); //lines of code // getApplicationContext() method passses the Context of main activity to the class TourFragmentPageAdapter } } 

这是扩展FragmentPageAdapter的非Activity类

 public class YourClass extends FragmentPagerAdapter { private String yourStringArray[] = new String[4]; Context context; public YourClass (FragmentManager fm, Context context) { super(fm); this.context = context; // store the context of main activity // now you can use this context to access any resource yourStringArray[0] = context.getResources().getString(R.string.tab1); yourStringArray[1] = context.getResources().getString(R.string.tab2); yourStringArray[2] = context.getResources().getString(R.string.tab3); yourStringArray[3] = context.getResources().getString(R.string.tab4); } @Override public Fragment getItem(int position) { } @Override public int getCount() { return 4; } @Override public CharSequence getPageTitle(int position) { // Generate title based on item position return yourStringArras[position]; } }