java - Android 中的 "Cannot make a static reference to a non-static method"

标签 java android static

我的 Android 程序中出现了一些旧错误“无法对非静态方法进行静态引用”的问题。我正在创建一个落沙游戏(类似于 Powder Game),我创建了一个名为 Control 的类,用于在屏幕底部创建一个控制栏,其中包含一个用于画笔大小的 slider (效果很好)和一个用于弹出允许用户选择所选元素的对话框。但是,当我从我的代码中调用 DemoActivity.showDialog(2) 时,它给出了对非静态错误的静态引用(DemoActivity 是我的应用程序的主要 Activity )。我也尝试将其更改为 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);!希望对遇到类似问题的小伙伴有所帮助!!

最佳答案

您必须在 DemoActivity 实例上调用 showDialog,而不是在类本身上。唯一可以调用 ClassName.methodName() 的情况是方法定义为静态的。 showDialog 不是静态方法。

要解决此问题,您需要实例化一个新的 DemoActivity 或获取一个现有的,然后对其调用 showDialog

编辑:如果您在实例化此Control 对象时已经有一个DemoActivity 实例,那么以下修改可能会起作用:

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

关于java - Android 中的 "Cannot make a static reference to a non-static method",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218773/

相关文章:

c# - 静态方法之间的调用——这会破坏线程安全吗?

c++ - 我可以使用匿名 lambda 来保留静态值吗?

java - 绕过运行时缺少 Java 泛型,将父类(super class)型绑定(bind)到子类实例

android - 带有自定义列表项的自动完成 View 未按预期工作

Android:测量其 xml 中定义的尺寸的 child

java - Glide库报错: You cannot start a load from a destroyed Activity

java - 从 main 方法中的类访问包含变量的非静态方法?

java - 与文件相关的 NullPointerException

java - Android 在有字母时禁用文本观察器

java - 写入和复制文本文件