I'm having some issues with the old "Cannot make a static reference to a non-static method" error in my Android program. I am creating a sand falling game (similar to the Powder Game) and I created a class called Control to create a Control Bar at the bottom of the screen with a slider for brush size (that works fine) and a button to pop up a Dialog to allow users to pick the selected element. However, when I call DemoActivity.showDialog(2) from my code, it gives the static reference to non-static error (DemoActivity is the main activity of my application). I also tried changing it to just Activity.showDialog(2), but I got exactly the same error! Please help, what am I doing wrong? Here's my code and thanks in advance:
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: I fixed it by adding the following to my Control.java code:
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 } } ); } And then calling control.setActivity(this); from my onResume section of DemoActivity.java! Hope it helps those of you with similar issues!!