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);
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
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
.
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.
Application
, par exemple public class App extends Application {
. Référez-vous le code à côté des étapes.Android:name
de votre balise <application>
dans AndroidManifest.xml
pour qu'il pointe vers votre nouvelle classe, par exemple. Android:name=".App"
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()
.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;
}
}
Avez-vous accès à la Context
? Ou très probablement, vous pouvez y accéder par getApplicationContext()
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);
Nous pouvons utiliser le contexte Comme ceci essayez maintenant Où le parent est le ViewGroup.
Context context = parent.getContext();
cela peut être fait en utilisant
context.getResources().getXml(R.xml.samplexml);
Ç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);
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
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];
}
}
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);
}
}