2011-11-23 10 views
51

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.¿Cómo llamar a getResources() de una clase que no tiene contexto?

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 que tengo que configurar la imagen de fondo y la posición del objeto de la clase Droid Droid itself.Here estoy frente a la issue.Given a continuación es 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 me puede ayudar. Solo quiero establecer la imagen de fondo y ubicarla para el objeto Droid desde la clase Droid.

+1

posible duplicado de [Utilización getResources() en la clase de inactividad] (http://stackoverflow.com/ preguntas/7666589/using-getresources-in-non-activity-class) –

Respuesta

46

Un contexto es un identificador 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. Puede pasar contexto en el constructor como

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

es posible establecer el contexto para la clase Droid ... no está extendiendo la actividad o cualquier otra clase –

+2

no necesita extender una actividad. Puede pasar contexto a esta clase al inicializar esta clase de alguna actividad. – Ali

28

La solución normal a esto es pasar una instancia del contexto a la clase a medida que la crea, o después de crearla por primera vez pero antes de necesitar 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, ejemplos añadió

Cualquiera de modificar la clase Droid a ser 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 crear una cosa 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 llamar a la aplicación. contexto() donde sea que necesite un contexto - tenga en cuenta que no todas las funciones están disponibles en el contexto de una aplicación, algunas solo están disponibles lable en un contexto de actividad pero sin duda hará con su necesidad de getResources().

Tenga en cuenta que tendrá que añadir androide: nombrar 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" > 
+0

El mapa de bits de Android Usind también proporciona un acoplamiento ajustado al código de Android. Normalmente trato de separar el código relacionado con la interfaz y las cosas específicas de la aplicación (no soy exitoso) –

+0

@zeetoobiker ... ¿puedes explicarme estas cosas? No te entendí ... no estoy tan familiarizado con Android. –

+0

No me refería en realidad al acoplamiento estricto al código de Android (suponiendo que le haya dado acceso al objeto Aplicación con un método estático), sino que la clase Droid estará estrechamente unida al proyecto en el que se encuentra actualmente: usted no estará capaz de usarlo en un proyecto diferente sin volver a escribir las partes internas. Para ser sincero, una clase en una aplicación de Android que se ocupe de funciones de visualización va a estar estrechamente unida a Android, así que no me preocuparía. – zeetoobiker

22

Ejemplo: Obtención de nombre_apl cadena:

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

Esto solo usa los recursos del sistema, no los recursos de la aplicación, que en el 99% de los casos no funcionarán – Adam

+0

sí ... esto tampoco funcionó para mí. Necesitaba acceder a los recursos de la aplicación para una traducción enum a cadenas y no se encontraron. Terminó teniendo que crear una función que asignó la enumeración a un recurso y usó la Actividad como se menciona en otra parte de esta publicación. –

1

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 se relaciona con esta pregunta, pero ejemplo usando un Fragmento para acceder a los recursos/actividades del sistema como este:

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

Se puede hacer fácilmente si u habían declarado una clase que se extiende por la solicitud de

Esta clase será como un producto único, así que cuando u necesidad de un contexto u puede conseguirlo como este:

I creo que esto es la mejor respuesta y el limpiador

Aquí está mi código de paquete de utilidades:

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