«Невозможно сделать статическую ссылку на нестатический метод» в Android - PullRequest
5 голосов
/ 08 февраля 2010

У меня возникли проблемы со старой ошибкой «Невозможно сделать статическую ссылку на нестатический метод» в моей программе Android. Я создаю игру с падающим песком (похожую на Powder Game) и создал класс с именем Control, чтобы создать панель управления в нижней части экрана с ползунком для размера кисти (который отлично работает) и кнопкой для всплывающего окна. Диалог, позволяющий пользователям выбирать выбранный элемент. Однако, когда я вызываю DemoActivity.showDialog (2) из ​​моего кода, он дает статическую ссылку на нестатическую ошибку (DemoActivity является основной деятельностью моего приложения). Я также попытался изменить его на Activity.showDialog (2), но я получил точно такую ​​же ошибку! Пожалуйста, помогите, что я делаю не так? Вот мой код и заранее спасибо:

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);
    }
}

РЕДАКТИРОВАТЬ: я исправил это, добавив следующее в мой код 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
                        }
                    }
            );
}

И затем вызов control.setActivity(this); из моего раздела onResume в DemoActivity.java! Надеюсь, это поможет тем из вас, кто сталкивается с подобными проблемами !!

Ответы [ 2 ]

12 голосов
/ 08 февраля 2010

Вы должны вызвать showDialog в DemoActivity экземпляре, а НЕ в самом классе. Единственный раз, когда вы можете вызвать ClassName.methodName(), это если метод определен как статический. showDialog не является статическим методом.

Чтобы это исправить, вам нужно либо создать новый DemoActivity, либо получить существующий, а затем вызвать showDialog.

Редактировать: Если у вас уже есть экземпляр DemoActivity при создании экземпляра этого объекта Control, возможно, будет работать следующая модификация:

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 голосов
/ 05 июня 2011

, если create вызывается ANDROID, поэтому вы не создаете экземпляр, просто поместите в create mShowDialog=this или mShowDialog=pShowDialog

другими словами - создать сохранить значение экземпляра Также вы можете добавить общедоступный метод get для получения значения этого экземпляра. Затем вы можете получить доступ к функции экземпляра через реферат, вставив геттер:

ABSTRACTCLASS.getInstance().applyFunction();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...