首页 新闻 搜索 专区 学院

Android主类的Button按钮,监听事件里如何调用外部类的方法

0
悬赏园豆:10 [待解决问题]

问题描述:我是写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)

问题补充:

wangjiafei05220的主页 wangjiafei05220 | 初学一级 | 园豆:194
提问于:2016-03-21 13:34
< >
分享
所有回答(2)
0

蓝色部分传染MainActivity.this就行了,还有你的GameView为什么不直接放在Activity的布局文件里面?

zhoumy | 园豆:603 (小虾三级) | 2016-03-21 21:27

现在已经改好了,直接把GameView的全包名放到Button标签内替代Button标签,然后在MainActivity里创建并打点调用startGame方法即可。

支持(0) 反对(0) wangjiafei05220 | 园豆:194 (初学一级) | 2016-03-21 22:11
0

解决方法:

1.MainActivity.xml里的Button标签,把Button改为GameView类的全包名

2.在MainActivity.java文件的onCreate方法里声明这个GameView

3.直接调用GameView.startGame()方法即可

截图:

wangjiafei05220 | 园豆:194 (初学一级) | 2016-03-21 22:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册