gka*_*war 5 java static android
我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我通过在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
}
}
);
}
Run Code Online (Sandbox Code Playgroud)
然后control.setActivity(this);从我的DemoActivity.java的onResume部分调用!希望它可以帮助那些有类似问题的人!
Kal*_*see 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);
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21999 次 |
| 最近记录: |