在非活动类中使用 getResources()

我试图在一个非活动类中使用 getResources 方法。如何获得对“ resources”对象的引用,以便访问存储在 resources 文件夹下的 xml 文件?

例如:

XmlPullParser xpp = getResources().getXml(R.xml.samplexml);
204938 次浏览

您必须向它传递一个 context对象。如果在活动中有对类的引用,可以选择 this,也可以选择 getApplicationContext()

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

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

public class RegularClass(){
private Context context;


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


public findResource(){
context.getResources().getXml(R.xml.samplexml);
}
}

其中构造函数接受 Context作为参数

这可以通过使用

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

不需要通过上下文,做所有这些... 只需要这样做

Context context = parent.getContext();

编辑: 其中父节点是 ViewGroup

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

这对我总是有效:

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

我的回答是:

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

还有一种不创建对象的方法。检查 参考文献。谢谢你@Cristian。下面我添加了上述参考文献中提到的步骤。对我来说,我不喜欢为此创建一个对象和访问。所以我尝试在不创建对象的情况下访问 getResources()。我发现了这个帖子。所以我想加上这个作为答案。

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

  • 创建一个 Application的子类,例如 public class App extends Application {
  • AndroidManifest.xml中设置 <application>标记的 android:name属性以指向新类,例如 android:name=".App"
  • 在应用程序实例的 onCreate()方法中,将上下文(例如 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;
}
}

在 Udacity 的基础 ANdroid 课程的导游应用程序中,我使用了碎片的概念。我遇到了一段时间的困难,访问一些字符串中描述的字符串资源,xml 文件。终于想到办法了。

这是主要的活动课

包 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];
}
}

我们可以使用上下文,像这样现在尝试,其中的父级是 ViewGroup。

Context context = parent.getContext();

在简单的类声明上下文并从 res 文件夹中获取文件数据

public class FileData
{
private Context context;


public FileData(Context current){
this.context = current;
}
void  getData()
{
InputStream in = context.getResources().openRawResource(R.raw.file11);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
//write stuff to get Data


}
}

在活动类中像这样声明

public class MainActivity extends AppCompatActivity
{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


setContentView(R.layout.activity_main);
FileData fileData=new FileData(this);
}


}

我迟到了,但完全解决了; : 示例类,像这样使用上下文:-

public class SingletonSampleClass {


// Your cute context
private Context context;
private static SingletonSampleClass instance;


// Pass as Constructor
private SingletonSampleClass(Context context) {
this.context = context;
}


public synchronized static SingletonSampleClass getInstance(Context context) {
if (instance == null) instance = new SingletonSampleClass(context);
return instance;
}


//At end, don't forgot to relase memory
public void onDestroy() {
if(context != null) {
context = null;
}
}
}

警告(内存泄漏)

怎么解决这个问题?

选项1 : 您可以传递 applicationContext () ,而不是传递活动上下文(即这个)到单例类。

选项2: 如果您真的必须使用活动上下文,那么当活动被销毁时,确保您传递给单例类的上下文被设置为 null。

希望能有帮助

你的主要活动:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(ResourcesHelper.resources == null){
ResourcesHelper.resources = getResources();
}
}
}

资源帮手:

public class ResourcesHelper {
public static Resources resources;
}

那就到处用

String s = ResourcesHelper.resources.getString(R.string.app_name);