为什么这个MainActivity类代码有效?

时间:2018-01-20 08:57:01

标签: java android

我正在编写tic tac toe游戏,其中我调用imageTapped图像被点击以改变其图像交叉然后它调用aiturn以找到有效的移动并将其图像更改为圆形。现在我的问题是如何从非静态方法imageTapped调用非静态方法,而不创建其对象。

package com.example.kapil.tictactoe;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private GameLogic gameLogic;
    LinearLayout linearLayout;
    TextView label;

    public void imageTapped (View view) {
        ImageView image = (ImageView) view;
        label = findViewById(R.id.label);
        String pos = image.getTag().toString();

        //if button is already tapped
        if (! gameLogic.setImage(Integer.valueOf(pos)))
            return;
        image.setImageResource(R.drawable.cross);

        //return 1 for win 2 for draw otherwise 0
        int  win = gameLogic.logic();
        if (win == 1) {
            label.setText("You Win!!");
            gameLogic.gameOver();
            return;
        } else if (win == 2) {
            label.setText("Game Draws!!");
            return;
        }

        aiturn();

    }

    public void aiturn () {
        int move = gameLogic.aiMove();//return best move between 0 to 8

        int rowNum = move/3;
        int colNum = move%3;

        if (rowNum == 0) {
            linearLayout = findViewById(R.id.line1);
        } else if (rowNum == 1) {
            linearLayout = findViewById(R.id.line2);
        } else if (rowNum == 2) {
            linearLayout = findViewById(R.id.line3);
        }
        ((ImageView) linearLayout.getChildAt(colNum)).setImageResource(R.drawable.circle);
        label = findViewById(R.id.label);

        //return 1 for win 2 for draw otherwise 0
        int win = gameLogic.logic();
        if (win == 1) {
            label.setText("AI wins!!");
            gameLogic.gameOver();
        } else if (win == 2) {
            label.setText("Game Draws!!");
        }
    }

    //if play again button is pressed
    public void Reset (View view) {
        gameLogic.reset();
        TextView label = findViewById(R.id.label);
        label.setText("");

        int ids[] = {R.id.line1,R.id.line2,R.id.line3};

        for (int k=0;k<ids.length;k++) {
            LinearLayout linearLayout = findViewById(ids[k]);
            for (int i = 0; i < linearLayout.getChildCount(); i++) {
                ((ImageView) linearLayout.getChildAt(i)).setImageResource(R.mipmap.ic_launcher);
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gameLogic = new GameLogic();
    }
}

2 个答案:

答案 0 :(得分:2)

这是有效的,因为Android框架会创建活动的实例。

答案 1 :(得分:0)

  

现在我的问题是如何从非静态方法aiturn调用非静态方法imageTapped而不创建其对象。

Android应用程序不是使用public static void main(...)方法启动的,就像传统的Java应用程序一样。

相反,当您的应用程序启动时,Android框架会自动创建应用程序活动类的实例,并将它们连接到用户界面(根据XML文件)。

然后,当用户点击&#34;时,框架会调用(现有)活动对象上的imageTapped方法。然后在同一个对象上调用aiturn

或者至少,我认为这是编写该代码的人的 intent 。实际上,imageTapped方法似乎不是MainActivity类的超类层次结构中的API方法。所以我怀疑它不会被召唤。

我不确定你到底想要做什么,但也许你应该覆盖onTouchEvent(...)