En passant contexte de Gestionnaire
Est-il possible de passer des arguments à un Android Handler?? J'ai deux morceaux de code.
new Thread(){
public void run(){
for(;;){
uiCallback.sendEmptyMessage(0);
Thread.sleep(2000); //sleep for 2 seconds
}
}
}.start();
private Handler uiCallback = new Handler(){
public void handleMessage(Message msg){
//add a new blossom to the blossom ArrayList!!
blossomArrayList.add(new Blossom(context, R.drawable.blossom));
}
};
Bien sûr, je reçois une erreur, car la méthode de Gestionnaire ne peut pas voir mon contexte. C'est probablement à cause de ce morceau de code
public BoardView(Context context){
super(context);
Contexte n'est pas visible ailleurs, et je me demande si je peux la passer en argument à mon Gestionnaire.
EDIT: je vous poste les deux principaux morceaux de code pour répondre à une question sur le pourquoi de ma Fleur objet a besoin de contexte. Je me suis pas sûr à 100% >.> vous pourriez peut-être avoir un coup d'oeil et voir ce qu'il se passe.
public class Blossom{
private Bitmap blossom;
private float blossomX = 0;
private float blossomY = 0;
private Random generator = new Random();
public Blossom(Context context, int drawable)
{
blossom = BitmapFactory.decodeResource(context.getResources(), drawable);
blossomX = generator.nextInt(300);
}
public Bitmap getBitmap()
{
return blossom;
}
public float getBlossomX()
{
return blossomX;
}
public float getBlossomY()
{
return blossomY;
}
public void Fall(Canvas canvas, float boxY)
{
//draws the flower falling
canvas.drawBitmap(blossom, blossomX,
blossomY = blossomY+3 , null);
//collision detection, currently not working after
//implementing random start location
//if(blossomY + 29 == boxY)
//{
//canvas.drawBitmap(blossom,0,0,null);
//}
}
}
public class BoardView extends SurfaceView implements SurfaceHolder.Callback{
Context mContext;
Bitmap box =
(BitmapFactory.decodeResource
(getResources(), R.drawable.box));
private BoardThread thread;
private float box_x = 140;
private float box_y = 378;
private float boxWidth = box.getWidth();
private float boxHeight = box.getHeight();
private ArrayList<Blossom> blossomArrayList = new ArrayList<Blossom>();;
boolean mode = false;
RectF boxRect = new RectF(box_x,box_y, box_x + boxWidth, box_y + boxHeight);
public BoardView(Context context){
super(context);
//surfaceHolder provides canvas that we draw on
getHolder().addCallback(this);
//controls drawings
thread = new BoardThread(getHolder(),this);
//pass variables to instance of Blossom
//for(int i = 0; i <= 3; i++)
//{
//blossomArrayList.add(new Blossom(context, R.drawable.blossom));
//}
new Thread(){
public void run(){
for(;;){
uiCallback.sendEmptyMessage(0);
Thread.sleep(2000); //sleep for 2 seconds
}
}
}.start();
//intercepts touch events
setFocusable(true);
}
@Override
public void onDraw(Canvas canvas){
canvas.drawColor(Color.WHITE);
//draw box and set start location
canvas.drawBitmap(box, box_x - (boxWidth/2),
box_y - (boxHeight/2), null);
for(int i = 0; i<= 3; i++)
{
blossomArrayList.get(i).Fall(canvas, box_y);
}
}
@Override
public boolean onTouchEvent(MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN){
if(boxRect.contains(event.getX(),event.getY())){
mode = true;
}
}
if(event.getAction() == MotionEvent.ACTION_MOVE) {
if(boxRect.contains(event.getX(),event.getY())){
mode = true;
}
if(mode == true){
box_x = (int)event.getX();
boxRect.set(box_x,box_y, box_x + boxWidth, box_y + boxHeight);
}
}
if(event.getAction() == MotionEvent.ACTION_UP){
mode = false;
}
invalidate();
return true;
}
@Override
public void surfaceChanged(SurfaceHolder holder,
int format, int width, int height ){
}
@Override
public void surfaceCreated(SurfaceHolder holder){
thread.startRunning(true);
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder){
thread.startRunning(false);
thread.stop();
}
private Handler uiCallback = new Handler(){
public void handleMessage(Message msg){
//add a new blossom to the blossom ArrayList!!
blossomArrayList.add(new Blossom(context, R.drawable.blossom));
}
};
}
OriginalL'auteur Hani Honey | 2011-03-28
Vous devez vous connecter pour publier un commentaire.
Que si vous créez une sous-classe qui s'étend de Gestionnaire? De cette façon, vous pouvez passer toute les paramètres que vous voulez.
Mais juste par curiosité, pourquoi la Fleur de l'objet nécessite l'objet de contexte? Il est généralement préférable de séparer votre logique de partir de l'interface graphique de dépendances.
C'était la seule façon que je pouvais comprendre comment obtenir une image bitmap dans ma Fleur de la classe, c'est pourquoi.
Votre Fleur constructeur pourrait juste prendre le bitmap à la place. Mais néanmoins, ce que vous voulez peut être réalisé par la simple création d'une nouvelle classe de dire MyHandler qui s'étend de Gestionnaire et de créer un constructeur public MyHandler(Context context) {....}
Merci, je viens de passer le bitmap et c'était bien 😀 Pourquoi n'ai-je pas le faire en premier lieu...
pas de problème! 🙂
OriginalL'auteur kkudi
Créer une classe qui étend la classe de Gestionnaire, et de stocker une référence faible pour le contexte. Cela aidera à prévenir certains problèmes de mémoire.
OriginalL'auteur PearsonArtPhoto