studio programacion herramientas fundamentos con avanzado aplicaciones android class background android-context

programacion - manual de android en pdf



¿Cómo llamar a getResources() desde una clase que no tiene contexto? (5)

En mi aplicación tengo muchas clases y actividades. Droid es una clase que no tiene contexto. Mygame es una clase que extiende SurfaceView e implementa SurfaceHolder.Callback. Estoy creando un objeto de Droid en mygame class y estableciendo la imagen de fondo y la posición para él. El código que he escrito para esto se da a continuación.

block1 = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.birdpic), 100, 10);

El constructor de la clase Droid se da a continuación.

public Droid(Bitmap bitmap, int x, int y) { this.bitmap = bitmap; this.x = x; this.y = y; }

En un escenario particular, tengo que establecer la imagen de fondo y la posición del objeto Droid de la clase Droid. Aquí estoy enfrentando el problema. A continuación se muestra el fragmento de código para hacer esto.

if(checkflag) { myObj.centerblock=new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.blast), myObj.xpos, myObj.ypos); }

El problema es que la clase Droid no tiene contexto. Entonces no puedo usar getResources () aquí. He intentado con el siguiente código pero falla.

if(checkflag) { myObj.centerblock=new Droid(BitmapFactory.decodeResource(myObj.getResources(), R.drawable.blast), myObj.xpos, myObj.ypos); }

Alguien puede ayudarme. Solo quiero establecer la imagen de fondo y ubicarla para el objeto Droid desde la clase Droid.


Ejemplo: obtener la cadena de nombre_aplicación:

Resources.getSystem().getString( R.string.app_name )


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: block1 = new Droid(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.birdpic), 100, 10); //OR builder.setLargeIcon(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.birdpic)); //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);


La solución normal a esto es pasar una instancia del contexto a la clase a medida que la crea, o después de que se crea por primera vez, pero antes de que necesite usar el contexto.

Otra solución es crear un objeto Aplicación con un método estático para acceder al contexto de la aplicación, aunque eso acopla el objeto Droid bastante estrechamente en el código.

Editar, se agregaron ejemplos

O modifica la clase Droid para que sea algo como esto

public Droid(Context context,int x, int y) { this.bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.birdpic); this.x = x; this.y = y; }

O crea una aplicación como esta:

public class App extends android.app.Application { private static App mApp = null; /* (non-Javadoc) * @see android.app.Application#onCreate() */ @Override public void onCreate() { super.onCreate(); mApp = this; } public static Context context() { return mApp.getApplicationContext(); } }

Y llame a App.context () donde necesite un contexto. Sin embargo, tenga en cuenta que no todas las funciones están disponibles en el contexto de una aplicación, algunas solo están disponibles en un contexto de actividad, pero ciertamente lo hará con su necesidad de getResources ().

Tenga en cuenta que deberá agregar android: name a su definición de aplicación en su manifiesto, algo como esto:

<application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".App" >


Se puede hacer fácilmente si se ha declarado una clase que se extiende desde la aplicación

Esta clase será como un singleton, así que cuando necesites un contexto puedes obtenerlo así:

Creo que esta es la mejor respuesta y el limpiador

Aquí está mi código del paquete de Utilidades:

public static String getAppNAme(){ return MyOwnApplication.getInstance().getString(R.string.app_name); }


Un contexto es un controlador para el sistema; proporciona servicios como la resolución de recursos, la obtención de acceso a bases de datos y preferencias, y más. Es una "interfaz" que permite el acceso a los recursos específicos de la aplicación y la clase e información sobre el entorno de la aplicación. Sus actividades y servicios también amplían el contexto para que hereden todos esos métodos para acceder a la información del entorno en el que se ejecuta la aplicación.

Esto significa que debe tener que pasar el contexto a la clase específica si desea obtener / modificar cierta información específica sobre los recursos. Puedes pasar el contexto en el constructor como

public classname(Context context, String s1) { ... }