Usando getResources () en clase no activa

Estoy tratando de usar el método getResources en una clase que no es de actividad. ¿Cómo obtengo la referencia al objeto “recursos” para que pueda acceder al archivo xml almacenado en la carpeta de recursos?

Ejemplo:

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

Tendrás que pasarle un objeto de context . O this si tiene una referencia a la clase en una actividad, o getApplicationContext()

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

Luego puede usarlo en el constructor (o establecerlo en una variable de instancia):

 public class RegularClass(){ private Context context; public RegularClass(Context current){ this.context = current; } public findResource(){ context.getResources().getXml(R.xml.samplexml); } } 

Donde el constructor acepta Context como parámetro

No es una buena idea pasar objetos Context alrededor. Esto a menudo dará lugar a pérdidas de memoria. Mi sugerencia es que no lo hagas. He creado numerosas aplicaciones de Android sin tener que pasar el contexto a clases que no son de actividad en la aplicación. Una mejor idea sería obtener los recursos a los que necesita acceder mientras está en la Activity o Fragment , y retenerlos en otra clase. A continuación, puede usar esa clase en cualquier otra clase en su aplicación para acceder a los recursos, sin tener que pasar por los objetos de Context .

Hay una forma más sin crear un objeto también. Verifica la referencia . Gracias por @cristian. A continuación agrego los pasos que se mencionaron en la referencia anterior. Para mí, no me gusta crear un objeto para eso y acceder. Así que traté de acceder a getResources() sin crear un objeto. Encontré esta publicación. Así que pensé en agregarlo como respuesta.

Siga los pasos para acceder a getResources() en una clase que no sea de actividad without passing a context través del objeto.

  • Cree una subclase de Application , por ejemplo, public class App extends Application { . Consulte el código al lado de los pasos.
  • Establezca el atributo android:name de su etiqueta en AndroidManifest.xml para que apunte a su nueva clase, por ejemplo, android:name=".App"
  • En el método onCreate() de la instancia de su aplicación, guarde su contexto (por ejemplo, this ) en un campo estático llamado app y cree un método estático que devuelva este campo, por ejemplo, getContext() .
  • Ahora puede usar: App.getContext() siempre que quiera obtener un contexto, y luego podemos usar App.getContext().getResources() para obtener valores de los recursos.

Así es como debería verse:

 public class App extends Application{ private static Context mContext; @Override public void onCreate() { super.onCreate(); mContext = this; } public static Context getContext(){ return mContext; } } 

¿Tiene acceso al Context ? O lo más probable es que pueda obtener acceso a él mediante getApplicationContext()

aquí está mi respuesta:

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

}

y la llamada puede ser así:

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

Podemos usar el contexto Context context = parent.getContext(); Donde padre es el ViewGroup.

esto se puede hacer mediante el uso de

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

bueno, no hay necesidad de pasar el contexto y hacer todo eso … simplemente haz esto

 Context context = parent.getContext(); 

Edit: donde parent es el ViewGroup

Esto siempre funciona para mí:

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

No relacionado con esta pregunta, pero ejemplo usando un Fragmento para acceder a los recursos del sistema / actividad de esta manera:

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

En la aplicación de guía de viaje del curso básico ANdroid de Udacity, he utilizado el concepto de Fragmentos. Me quedé atrapado por un tiempo experimentando dificultades para acceder a algunos recursos de cadena descritos en cadenas, archivo xml. Finalmente obtuve una solución.

Esta es la clase de actividad principal

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

Esta es la clase de no actividad que extiende 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]; } }