2010-02-07 4 views
5

Je rencontre des problèmes avec l'ancienne erreur "Impossible de faire une référence statique à une méthode non statique" dans mon programme Android. Je crée un jeu de chute de sable (similaire au jeu Powder) et j'ai créé une classe appelée Control pour créer une barre de contrôle au bas de l'écran avec un curseur pour la taille du pinceau (qui fonctionne bien) et un bouton pour faire apparaître Dialogue pour permettre aux utilisateurs de choisir l'élément sélectionné. Cependant, lorsque j'appelle DemoActivity.showDialog (2) à partir de mon code, il donne la référence statique à l'erreur non statique (DemoActivity est l'activité principale de mon application). J'ai aussi essayé de le changer en Activity.showDialog (2), mais j'ai eu exactement la même erreur! S'il vous plaît, aidez, qu'est-ce que je fais de mal? Voici mon code et merci à l'avance:"Impossible de faire une référence statique à une méthode non statique" dans Android

package sand.falling.opengl; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 
import android.widget.SeekBar; 

public class Control extends LinearLayout 
{ 
    private ImageButton control_button; 
    private SeekBar brush_size_slider; 

    final CharSequence[] elementslist = {"Sand", "Water", "Plant", "Wall", "Fire", "Ice", "Generator", "Oil", "Magma", "Stone", "C4"}; 

    public Control(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    @Override 
    protected void onFinishInflate() 
    { 
     control_button = (ImageButton) findViewById(R.id.element_picker_button); 
     brush_size_slider = (SeekBar) findViewById(R.id.brush_size_slider); 

     control_button.setOnClickListener 
      (
        new OnClickListener() 
        { 
         public void onClick(View v) 
         { 
          //THIS DOESN'T WORK!!!! 
          DemoActivity.showDialog(2); //Run the element picker dialog 
         } 
        } 
      ); 
     control_button.setImageResource(R.drawable.palette); 

     brush_size_slider.setOnSeekBarChangeListener 
      (
        new SeekBar.OnSeekBarChangeListener() 
        { 
         public void onProgressChanged(SeekBar seekbar, int progress, boolean fromTouch) 
         { 
          int p = 32 * progress/100; 
          DemoActivity.setBrushSize(p); 
          Log.v("DemoActivity", "size:" + p); 
         } 
         public void onStartTrackingTouch(SeekBar seekbar) {} 
         public void onStopTrackingTouch(SeekBar seekbar) {} 
        } 
      ); 
     brush_size_slider.setProgress((int)400/32); 
    } 
} 

EDIT: Je l'ai fixé en ajoutant ce qui suit à mon code Control.java:

public class Control extends LinearLayout 
{ 
    private DemoActivity activity; 
     ... 
    public void setActivity(DemoActivity act) 
    { 
     activity = act; 
    } 
     ... 
     //Set a click listener for the button which should pop up element picker dialog when clicked 
     control_button.setOnClickListener 
      (
        new OnClickListener() 
        { 
         public void onClick(View v) 
         { 
          activity.showDialog(2); //Run the element picker dialog 
         } 
        } 
      ); 
} 

Et puis appeler control.setActivity(this); de ma section onResume de DemoActivity.java ! J'espère que cela aidera ceux d'entre vous qui ont des problèmes similaires !!

Répondre

12

Vous devez appeler showDialog sur une instance DemoActivity, PAS sur la classe elle-même. Le seul moment où vous pouvez appeler ClassName.methodName() est si la méthode est définie comme statique. showDialog n'est pas une méthode statique.

Pour résoudre ce problème, vous devez instancier un nouveau DemoActivity ou en obtenir un existant, puis appeler le showDialog.

Edit: Si vous avez déjà une instance DemoActivity lorsque vous instancier cet objet Control, peut-être la modification suivante fonctionnera:

public class Control extends LinearLayout 
{ 

    ... 

    // add an Activity instance 
    private Activity activity; 

    // set the Activity in your constructor 
    public Control(Context context, AttributeSet attrs, Activity activity) 
    { 
     super(context, attrs); 
     this.activity = activity; 
    } 

    @Override 
    protected void onFinishInflate() 
    { 
     ... 

      // Use the instance activity here 
      activity.showDialog(2); 
     ... 
    } 
} 
+0

Ah, je crois que je comprends. Comment pourrais-je obtenir une référence à une instance spécifique de la classe DemoActvity? AFAIK, je n'en crée pas moi-même, Android le fait automatiquement lorsque l'utilisateur lance mon application, alors comment le référencer? Merci pour la réponse rapide btw! – gkanwar

+1

Hmm, pas sûr, je n'ai pas encore fait de développement Android. Je vais jeter un oeil à la documentation de DemoActivity. Est-ce que DemoActivity a une méthode 'instance()' ou 'getInstance()'? Si oui, cela pourrait être ce dont vous avez besoin. –

+0

Eh bien, DemoActivity est une classe que j'ai créée qui étend la classe d'activité générale contenue dans le code Android de base. J'ai regardé la documentation de l'activité dans Android, et il y a une fonction appelée getInstanceCount(), mais rien de tel que instance() ou getInstance(). – gkanwar

0

si le créez est appelé par Android, de sorte que vous ne créez pas par exemple, il suffit de mettre dans la création mShowDialog=this ou mShowDialog=pShowDialog

en d'autres termes - ont la créer d'enregistrer la valeur de l'instance vous pouvez également ajouter un get publique pour obtenir cette valeur d'instance. Ensuite, vous pouvez accéder à la fonction d'exemple par l'abstrait en intercédant le getter:

ABSTRACTCLASS.getInstance().applyFunction(); 
Questions connexes