问题描述:我是写2048小游戏的时候发现的这个问题,而且一直无法解决。
1,这个是我的主类MainActivity,里面根据id添加了一个重玩按钮,我想实现点击按钮的时候重新开始游戏(没开通博客无法上传照片,我就发代码了)
////////////MainActivity.java代码:
public class MainActivity extends Activity {
public MainActivity() {
mainActivity = this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvScore = (TextView) findViewById(R.id.tvScore);
clearButton = (Button) findViewById(R.id.clearButton);
clearButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("重新玩 被电击了");
GameView g = new GameView(getMainActivity());
g.startGame();
}
});
}
2,逻辑实现类代码:
//////////////GameView.java代码,其中GameView继承了GridLayout
public class GameView extends GridLayout {
public GameView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initGameView();
}
public GameView(Context context) {
super(context);
initGameView();
}
public GameView(Context context, AttributeSet attrs) {
super(context, attrs);
initGameView();
}
…………
…………
public void startGame() {
if (MainActivity.getMainActivity() != null) // 报空指针,添加此句判断即可
// 计分系统给清零
MainActivity.getMainActivity().clearScore();
// 开始游戏前,可能有的值不是0,那么我们清理一下
for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
cardsMap[x][y].setNum(0);
}
}
// 清理后再添加俩随机数
addRandomNum();
addRandomNum();
}
3,MainActivity的Button监听里,有这么一句代码,就是上面加颜色的代码:
GameView g = new GameView(getMainActivity());
g.startGame();
这样调用不会报错,但不会运行。而按照Eclipse的提示,蓝色部分的参数为Context形式,这个形式怎么写才能正确运行?
希望各位朋友能够帮我解决这个问题,我没想到一个简单的调用就这么为难。感谢!!
log:
03-21 05:33:52.583: I/System.out(3294): 重新玩 被电击了
03-21 05:33:52.583: D/AndroidRuntime(3294): Shutting down VM
03-21 05:33:52.587: W/dalvikvm(3294): threadid=1: thread exiting with uncaught exception (group=0xa6184908)
03-21 05:33:52.599: E/AndroidRuntime(3294): FATAL EXCEPTION: main
03-21 05:33:52.599: E/AndroidRuntime(3294): java.lang.NullPointerException
03-21 05:33:52.599: E/AndroidRuntime(3294): at com.wang.my2048.GameView.startGame(GameView.java:115)
03-21 05:33:52.599: E/AndroidRuntime(3294): at com.wang.my2048.MainActivity$1.onClick(MainActivity.java:32)
03-21 05:33:52.599: E/AndroidRuntime(3294): at android.view.View.performClick(View.java:4204)
03-21 05:33:52.599: E/AndroidRuntime(3294): at android.view.View$PerformClick.run(View.java:17355)
03-21 05:33:52.599: E/AndroidRuntime(3294): at android.os.Handler.handleCallback(Handler.java:725)
03-21 05:33:52.599: E/AndroidRuntime(3294): at android.os.Handler.dispatchMessage(Handler.java:92)
03-21 05:33:52.599: E/AndroidRuntime(3294): at android.os.Looper.loop(Looper.java:137)
03-21 05:33:52.599: E/AndroidRuntime(3294): at android.app.ActivityThread.main(ActivityThread.java:5041)
03-21 05:33:52.599: E/AndroidRuntime(3294): at java.lang.reflect.Method.invokeNative(Native Method)
03-21 05:33:52.599: E/AndroidRuntime(3294): at java.lang.reflect.Method.invoke(Method.java:511)
03-21 05:33:52.599: E/AndroidRuntime(3294): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-21 05:33:52.599: E/AndroidRuntime(3294): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-21 05:33:52.599: E/AndroidRuntime(3294): at dalvik.system.NativeStart.main(Native Method)
蓝色部分传染MainActivity.this就行了,还有你的GameView为什么不直接放在Activity的布局文件里面?
现在已经改好了,直接把GameView的全包名放到Button标签内替代Button标签,然后在MainActivity里创建并打点调用startGame方法即可。
解决方法:
1.MainActivity.xml里的Button标签,把Button改为GameView类的全包名
2.在MainActivity.java文件的onCreate方法里声明这个GameView
3.直接调用GameView.startGame()方法即可
截图: