在非活动类中使用getResources()

问题描述 投票:109回答:11

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

例:

XmlPullParser xpp = getResources().getXml(R.xml.samplexml);
android android-context
11个回答
140
投票

你必须将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作为参数


1
投票

在Udacity的Basic ANdroid课程的导游应用程序中,我使用了Fragments的概念。我卡住了一段时间,难以访问字符串,xml文件中描述的一些字符串资源。终于得到了解决方案。

这是主要的活动类

package 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 
}
}

这是扩展FragmentPagerAdapter的非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];
}
}

0
投票

在简单的类声明上下文中,从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

        }
}

在activity类中声明如下

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

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

}

30
投票

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


12
投票

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

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

  • 创建Application的子类,例如public class App extends Application {。请参阅步骤旁边的代码。
  • android:name中设置<application>标签的AndroidManifest.xml属性以指向新的类,例如android:name=".App"
  • 在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;
    }
}

7
投票

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


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

}

并且通话可以是这样的:

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

3
投票

这可以通过使用来完成

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

3
投票

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

Context context = parent.getContext();

1
投票

没有必要传递上下文并做所有这些...只需这样做

Context context = parent.getContext();

编辑:其中parent是ViewGroup


1
投票

这对我来说总是有用的:

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...

}

与此问题无关,但使用Fragment访问系统资源/活动的示例如下:

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);
© www.soinside.com 2019 - 2024. All rights reserved.