【问题标题】:"Cannot make a static reference to a non-static method" in AndroidAndroid中的“无法对非静态方法进行静态引用”
【发布时间】:2010-02-07 23:14:08
【问题描述】:

我在我的 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);!希望对有类似问题的朋友有所帮助!!

【问题讨论】:

    标签: java android static


    【解决方案1】:

    您必须在 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);
            ...
        }
    }
    

    【讨论】:

    • 啊,我想我明白了。我将如何获取对 DemoActvity 类的特定实例的引用。 AFAIK,我自己没有创建一个,当用户运行我的应用程序时,Android会自动创建它,那么我该如何引用它呢?顺便说一句,感谢您的快速答复!
    • 嗯,不确定,我还没有做过任何Android开发。我将查看 DemoActivity 文档。 DemoActivity 是否有 instance()getInstance() 方法?如果是这样,那可能就是您所需要的。
    • 嗯,DemoActivity 是我创建的一个类,它扩展了包含在基本 Android 代码中的通用 Activity 类。我在 Android 中查找了 Activity 的文档,并且有一个名为 getInstanceCount() 的函数,但没有像 instance() 或 getInstance() 这样的函数。
    • 如果您在 Control 类之外有一个现有的 DemoActivity 实例,您可以将它传递给 Control 构造函数,将其保存为 Control 的属性,然后在 onFinishInflate() 中使用它。
    • 我尝试了您的编辑,它修复了错误,但是当我在模拟器中运行我的应用程序并单击按钮时,它在 Control.java 的第 42 行出现 NullPointerException 崩溃:activity.showDialog (2); //运行元素选择器对话框我不太清楚为什么。
    【解决方案2】:

    如果create是由ANDROID调用的,所以不创建实例,直接放入createmShowDialog=thismShowDialog=pShowDialog

    换句话说 - 让创建保存实例值 您也可以添加一个公共获取来获取该实例值。 然后就可以通过调用getter来通过abstract访问实例函数了:

    ABSTRACTCLASS.getInstance().applyFunction();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-25
      • 2023-04-02
      • 2013-06-30
      • 2014-06-08
      相关资源
      最近更新 更多