2010-02-07 22 views
5

Tengo algunos problemas con el viejo error "No se puede hacer una referencia estática a un método no estático" en mi programa Android. Estoy creando un juego de caída de arena (similar al juego de polvo) y creé una clase llamada Control para crear una barra de control en la parte inferior de la pantalla con un control deslizante para el tamaño del pincel (que funciona bien) y un botón para abrir un Diálogo para permitir a los usuarios elegir el elemento seleccionado. Sin embargo, cuando llamo DemoActivity.showDialog (2) desde mi código, proporciona la referencia estática al error no estático (DemoActivity es la actividad principal de mi aplicación). También intenté cambiarlo a Activity.showDialog (2), ¡pero obtuve exactamente el mismo error! Por favor, ayuda, ¿qué estoy haciendo mal? Aquí está mi código y gracias de antemano:"No se puede hacer una referencia estática a un método no estático" en 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: me fijo añadiendo lo siguiente a mi código 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 
         } 
        } 
      ); 
} 

Y luego llamar control.setActivity(this); de mi sección de onResume DemoActivity.java ! ¡Espero que ayude a aquellos de ustedes con problemas similares!

Respuesta

12

Tiene que llamar al showDialog en una instancia DemoActivity, NO en la propia clase. La única vez que puede llamar al ClassName.methodName() es si el método se define como estático. showDialog no es un método estático.

Para arreglar esto, o necesita crear una instancia de una nueva DemoActivity u obtener una existente, luego llame al showDialog en eso.

Editar: Si ya tiene una instancia DemoActivity cuando se instancia este objeto Control, quizás la siguiente modificación funcionará:

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, creo que lo entiendo. ¿Cómo podría obtener una referencia a una instancia específica de la clase DemoActvity? AFAIK, yo no creo uno, Android lo hace automáticamente cuando el usuario ejecuta mi aplicación, entonces, ¿cómo lo hago? Gracias por la respuesta rápida por cierto! – gkanwar

+1

Hmm, no estoy seguro, aún no he hecho ningún desarrollo de Android. Voy a echar un vistazo a la documentación DemoActivity. ¿Tiene DemoActivity un método 'instance()' o 'getInstance()'? Si es así, eso podría ser lo que necesitas. –

+0

Bueno, DemoActivity es una clase que he creado que amplía la clase de actividad general contenida en el código básico de Android. Busqué la documentación para Activity en Android, y hay una función llamada getInstanceCount(), pero nada como simplemente instance() o getInstance(). – gkanwar

0

si el cree se llamará por Android, por lo que no se crea la ejemplo, sólo hay que poner en el mShowDialog=this crear o mShowDialog=pShowDialog

en otras palabras - tener la creación de guardar el valor de instancia también puede agregar un encuentro público para conseguir que el valor de la instancia. A continuación, puede acceder a la función a través de la instancia abstracta interceder por el captador:

ABSTRACTCLASS.getInstance().applyFunction(); 
Cuestiones relacionadas