当前位置: 首页 > 面试题库 >

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

董小林
2023-03-14
问题内容

我的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);从我的DemoActivity.java的onResume部分调用!希望它能帮助您解决类似问题!


问题答案:

你要调用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);
        ...
    }
}


 类似资料:
  • 问题内容: 到目前为止,我有以下代码: } 当我尝试在末尾设置double 时,出现错误消息“无法对非静态方法进行静态引用”。它说解决方法是也使该方法静态化,但是我的教授告诉我不要将该字段静态化。有一个简单的解决方案我只是想念吗? 问题答案: 静态方法属于该类,非静态方法属于该类的 实例 。 当您从呼叫时,您会收到错误消息,因为它与任何实例都没有关联。 您需要创建该类的实例: 然后,您可以调用实例

  • 我试图在我的程序中使用accessors(Set/Get)方法,当我试图在main方法中使用Get方法时,我得到了以下错误: 无法从Student类型对非静态方法进行静态引用。 我不确定如何着手解决这个问题。我是Java编程的初学者。 以下是具体的问题: 设置/获取方法: 错误行: 任何建议都将不胜感激* 我的代码的完整图片。

  • 可能重复: “不能从静态上下文引用非静态方法”背后的原因是什么? 不能对非静态方法进行静态引用 不能对非静态字段进行静态引用 我不明白我的代码出了什么问题。 线程“main”java.lang.error中的异常:未解决的编译问题:无法静态引用Two中的非静态方法fxn(int)

  • 问题内容: 我无法编译以下代码: 出现以下错误: 无法从静态内容引用非静态方法calcArea(int,int) 这是什么意思?我该如何解决该问题..? 编辑: 根据您的建议,我创建了一个新的test()实例,如下所示: 这样对吗?如果我这样做有什么区别… 问题答案: Nanne提出的建议绝对可以解决您的问题。但是,我认为如果现在就养成习惯,在学习Java的早期阶段,尝试尽可能少地使用静态方法(例

  • 问题内容: 我对Java和一般编程非常陌生。我为一个基本程序编写了此代码,以将用户输入的2个数字相加,并将它们加起来并显示在输出框中,但是我得到了,但是我不知道什么是静态的 给出错误的行: 抱歉,如果我非常不称职,但我搜索了一下,但我真不明白该如何解决。谢谢。 问题答案: 在静态上下文中,您没有对象(类的实例),但是实例变量和方法取决于它们。 您有一个名为output1的实例,但是您尝试通过类的名

  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是