2010-11-07 24 views
1

Dans mon programme, j'ai un objet de vue personnalisé. A l'intérieur de la classe de vue est une méthode appelée foo. Pour une raison quelconque, quand j'appelle foo de mon activité, elle ne se déclenche pas. Voici le code:Impossible d'appeler une méthode d'un objet de vue dans une activité

XML de la vue personnalisée:

<com.company.application.MyView 
    android:id="@+id/my_view" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

Le code d'activité:

public class Main extends Activity { 

    MyView mView; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View v = li.inflate(R.layout.main, null); 
     mView= (MyView) v.findViewById(R.id.my_view); 

     //A button to fire the method inside foo() 
     Button switchLeft = (Button) findViewById(R.id.switch_left); 
     switchLeft.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       callTest(); 
      } 
     }); 
    } 

    public void callTest() { 
     Log.w(this.getClass().getName(), "clicked left arrow"); 
     mView.foo(); 
     mView.postInvalidate(); 

    } 
} 

est enfin ici foo:

public void foo() { 
    mBackground = mContext.getResources().getDrawable(R.drawable.temp_canvas); 
    Log.w(this.getClass().getName(), "background set"); 
} 

Le premier journal est toujours écrit lorsque le bouton est enfoncé, mais le deuxième journal n'est pas parce que foo ne se déclenche jamais. Quel est le problème ici?

Merci d'avance tous.

Edit: sur demande, la vue complète

public class MyView extends View { 

    Drawable mBackground; 

    Context mContext; 

    public MyView (Context context) { 
     super(context); 
     mContext = context; 
     mBackground = mContext.getResources().getDrawable(R.drawable.leftarrow1); 
    } 

    public MyView (Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
     mBackground = mContext.getResources().getDrawable(R.drawable.leftarrow1); 
    } 

    public void foo() { 
     mBackground = mContext.getResources().getDrawable(R.drawable.temp_canvas); 
     Log.w(this.getClass().getName(), "background set"); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     Paint paint = new Paint(); 
     paint.setStyle(Paint.Style.FILL); 

     // draw a solid blue circle 
     paint.setColor(Color.BLUE); 
     canvas.drawCircle(20, 20, 15, paint); 

     // draw a test background 
     mBackground.setBounds(0, 0, 300, 400); 
     mBackground.draw(canvas); 
    } 
} 
+1

Nous devons voir le code de MyView – Falmarri

+0

Demandez et vous recevrez. Merci! – user432209

+0

Cela peut être évident, mais avez-vous essayé de parcourir le code avec le débogueur? Et si ce n'est pas possible, avez-vous essayé d'écrire dans le journal avant de définir l'arrière-plan (mais dans foo) et aussi avec un autre niveau de journal (par exemple, debug ou info)? –

Répondre

0

Après le redémarrage de l'émulateur, foo() est maintenant obtenir appelé, il ne vient pas défini l'arrière-plan correctement ... mais c'est une autre problème.