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!
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
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. –
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