web-dev-qa-db-fra.com

Utilisation de getResources () dans une classe de non activité

J'essaie d'utiliser la méthode getResources dans une classe de non-activité. Comment obtenir la référence à l'objet "ressources" pour pouvoir accéder au fichier xml stocké dans le dossier des ressources?

Exemple:

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

Vous devrez lui passer un objet context. Soit this si vous avez une référence à la classe dans une activité, ou getApplicationContext()

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

Ensuite, vous pouvez l’utiliser dans le constructeur (ou le définir sur une variable d’instance):

public class RegularClass(){
    private Context context;

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

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

Où le constructeur accepte Context en tant que paramètre

141
LuckyLuke

Ce n'est pas une bonne idée de passer Context objets. Cela conduira souvent à des fuites de mémoire. Ma suggestion est que vous ne le faites pas. J'ai créé de nombreuses applications Android sans avoir à passer de contexte aux classes de non-activité de l'application. Une meilleure idée serait d'obtenir les ressources auxquelles vous avez besoin d'accéder pendant que vous êtes dans la Activity ou Fragment, et de la conserver dans une autre classe. Vous pouvez ensuite utiliser cette classe dans toutes les autres classes de votre application pour accéder aux ressources, sans avoir à transmettre d'objets Context.

31
Jason Crosby

Il y a une autre manière sans créer un objet aussi. Vérifiez le référence . Merci pour @cristian. J'ajoute ci-dessous les étapes mentionnées dans la référence ci-dessus. Pour moi, je n'aime pas créer un objet pour cela et y accéder. J'ai donc essayé d'accéder à la getResources() sans créer d'objet. J'ai trouvé ce post. Alors j'ai pensé à l'ajouter comme réponse.

Suivez les étapes pour accéder à getResources() dans une classe de non activité without passing a context via l'objet.

  • Créez une sous-classe de Application , par exemple public class App extends Application {. Référez-vous le code à côté des étapes.
  • Définissez l'attribut Android:name de votre balise <application> dans AndroidManifest.xml pour qu'il pointe vers votre nouvelle classe, par exemple. Android:name=".App"
  • Dans la méthode onCreate() de votre instance d'application, enregistrez votre contexte (par exemple this) dans un champ statique nommé app et créez une méthode statique qui renvoie ce champ, par exemple. getContext().
  • Vous pouvez maintenant utiliser: App.getContext() chaque fois que vous souhaitez obtenir un contexte, puis utiliser App.getContext().getResources() pour obtenir des valeurs à partir des ressources.

Voici à quoi cela devrait ressembler:

public class App extends Application{

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
    }

    public static Context getContext(){
        return mContext;
    }
}
12
Mahendran Sakkarai

Avez-vous accès à la Context? Ou très probablement, vous pouvez y accéder par getApplicationContext()

7
Kristian

voici ma réponse:

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

}

et l'appel peut être comme ça:

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

Nous pouvons utiliser le contexte Comme ceci essayez maintenant Où le parent est le ViewGroup.

Context context = parent.getContext();
3
Jaydip Umaretiya

cela peut être fait en utilisant

context.getResources().getXml(R.xml.samplexml);
3
A.R.Asha

Ça fonctionne toujours pour moi:

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

}

Pas lié à cette question mais exemple utilisant un Fragment pour accéder aux ressources/activités du système comme ceci:

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

eh bien, pas besoin de passer le contexte et de faire tout cela ... faites-le simplement

Context context = parent.getContext();

Edit: où parent est le ViewGroup

1
Ankit Srivastava

Dans l'application de guide de base d'Udacity Android, j'ai utilisé le concept de Fragments. Je me suis retrouvé bloqué pendant un certain temps, éprouvant des difficultés à accéder à certaines ressources de chaîne décrites dans les chaînes, fichier XML. Enfin obtenu une solution.

C'est la classe d'activité principale

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

C'est la classe non Activity qui étend FragmentPageAdapter

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];
}
}
1
Satadru Saha

Dans une classe simple, déclarer le contexte et obtenir les données du fichier du dossier 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

        }
}

Dans la classe d'activité déclarer comme ceci

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

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

}
0
sagar