在非活动类中使用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应用程序,而不必将应用程序的上下文传递给非活动类。 一个更好的想法是在Activity
或Fragment
获取需要访问的资源,并在另一个类中保存它。 然后,您可以在应用中的任何其他类中使用该类来访问资源,而不必传递Context
对象。
还有一种方法,也没有创build一个对象。 检查参考 。 感谢@ cristian。 下面我添加上面提到的步骤。 对我而言,我不喜欢为这个和访问创build一个对象。 所以我试图访问getResources()
而不创build一个对象。 我发现这个职位。 所以我想添加它作为答案。
按照以下步骤访问非活动类中的getResources()
, without passing a context
对象without passing a context
。
- 创build
Application
的子类,例如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]; } }