Android中的“无法对非静态方法进行静态引用”

时间:2010-02-07 23:14:08

标签: java android static

我的Android程序中存在旧版“无法对非静态方法进行静态引用”错误。我正在创建一个沙子游戏(类似于粉末游戏),我创建了一个名为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
                        }
                    }
            );
}

然后从DemoActivity.java的onResume部分调用control.setActivity(this);!希望它可以帮助那些有类似问题的人!!

2 个答案:

答案 0 :(得分:12)

您必须在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); ... } } 对象时已有{{1}}实例,则可能会执行以下修改:

{{1}}

答案 1 :(得分:0)

如果创建是由ANDROID调用的,那么您不创建实例,只需添加到创建mShowDialog=thismShowDialog=pShowDialog

换句话说 - 让create保存实例值 你也可以添加一个public get来获取该实例值。 然后你可以通过调用getter来访问实例函数:

ABSTRACTCLASS.getInstance().applyFunction();