Java 如何从视图类访问数组?

Java 如何从视图类访问数组?,java,android,android-studio,Java,Android,Android Studio,我目前正在一个10x10的网格上工作,并试图对其中的方框进行修改。我有3个类在为这个操作操作,但我不能在进行更改后更改视图。 3类: Main(我在其中进行更改) 游戏(我处理和应用更改的地方) System.out.println(“放置船只:+size+isHorizontal+left+top”); if(isHorizontal==true){//if horiz 如果(gameGrid[上][左]==0){ 对于(int i=0;i

我目前正在一个10x10的网格上工作,并试图对其中的方框进行修改。我有3个类在为这个操作操作,但我不能在进行更改后更改视图。 3类:

  • Main(我在其中进行更改)

  • 游戏(我处理和应用更改的地方)

    System.out.println(“放置船只:+size+isHorizontal+left+top”);
    if(isHorizontal==true){//if horiz
    如果(gameGrid[上][左]==0){
    对于(int i=0;i
  • 视图(我在其中绘制网格)

    System.out.println(“设置视图数组”);
    for(int col=0;col0){
    System.out.println(“foooooound!”;//收到罚款
    油漆=MPLAYER1油漆;
    }否则{
    油漆=MBG油漆;
    }
    drawRect(cx,cy,单面+(cx),单面+(cy),绘画);
    }
    System.out.println(“”);
    }
    System.out.println(“设置视图数组结束”);
    
  • 我的游戏类中的placedCell方法

        mainActivity.setRow(row);
        mainActivity.setCol(column);
    
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                int flag = gameGrid[row][column];
                if(i == column && j == row){
                    if(flag > 0){ //because unedited places is 0, edited places are more than 0
                        gameGrid[row][column] = flag;
                    }
                } } }
        return gameGrid[row][column];
    
    mainActivity.setRow(行);
    mainActivity.setCol(列);
    对于(int i=0;i<10;i++){
    对于(int j=0;j<10;j++){
    int flag=gameGrid[行][列];
    if(i==列&&j==行){
    如果(标志>0){//因为未编辑的位置为0,编辑的位置大于0
    gameGrid[行][列]=标志;
    }
    } } }
    返回gameGrid[行][列];
    
  • 我的问题是我的视图类无法从我的游戏类中获取更改的数组(gameGrid)。我试图打印数组以检查它是否正确更改,是否正确。 我还将游戏类中的数组声明为静态数组,但没有任何更改。 感谢您的帮助。

    • 为了在视图类中进行更改,一种方法是传递 将整个视图类引用到您在阵列gameGrid中进行更改的游戏类

    • 然后可以调用view.invalidate()在更新数组时重新绘制网格。invalidate()将再次调用view类的onDraw()方法

    您可以在游戏类的构造函数中传递视图引用-

    MyGameView mView; 
        public Game(MyGameView view)
        {
        mView=view;
         ...
        }
    
    或者在游戏类中创建一个方法,在创建视图后设置mView的值-

    public void setViewReference(MyGameView view)
    {
    mView=view;
    }
    
    现在,在视图类中创建一个公共方法,该方法将接收更新的数组并重新绘制整个网格-

    public void update(int [][] updatedGameGrid) //Assuming the array is int. Change the datatype is its not an int array
    {
       gameGrid=updatedGameGrid; //Here gameGrid is the array inside your view class
       invalidate(); // Redraw the entire View (grid) again by calling onDraw()
    }
    
    现在,在游戏类中,可以更新数组并将其传递给view类

    public void update() 
    {
     ... //Place you code to update the gameGrid array
     mView.update(gameGrid); //Pass the array to view class
    }
    
    • 为了在视图类中进行更改,一种方法是传递 将整个视图类引用到您在阵列gameGrid中进行更改的游戏类

    • 然后可以调用view.invalidate()在更新数组时重新绘制网格。invalidate()将再次调用view类的onDraw()方法

    您可以在游戏类的构造函数中传递视图引用-

    MyGameView mView; 
        public Game(MyGameView view)
        {
        mView=view;
         ...
        }
    
    或者在游戏类中创建一个方法,在创建视图后设置mView的值-

    public void setViewReference(MyGameView view)
    {
    mView=view;
    }
    
    现在,在视图类中创建一个公共方法,该方法将接收更新的数组并重新绘制整个网格-

    public void update(int [][] updatedGameGrid) //Assuming the array is int. Change the datatype is its not an int array
    {
       gameGrid=updatedGameGrid; //Here gameGrid is the array inside your view class
       invalidate(); // Redraw the entire View (grid) again by calling onDraw()
    }
    
    现在,在游戏类中,可以更新数组并将其传递给view类

    public void update() 
    {
     ... //Place you code to update the gameGrid array
     mView.update(gameGrid); //Pass the array to view class
    }
    

    我遵循了你提到的每一步,但仍然没有任何改变。我还必须声明一个新的int[][]我的视图类中包含元素的数组,因为在第一次打开时,它尝试读取空数组,应用程序崩溃。执行此操作后,什么也没有发生。程序与以前一样工作正常,实际网格在游戏类中更新,但不会再次更改视图类的数组元素。此外,游戏类中的更新方法看起来像s未使用(带下划线和灰色),这可能与此有关吗?game类中的update()方法非常重要。它将更新传递给View类。更改数组后,您需要做的是调用game class.mView.update(gameGrid)的更新方法;//这是将数组传递给view类所必需的。请参阅代码的第二点,在这里处理和应用对数组的更改。调用update()更改arrayOkay后,我执行了这些操作,但现在有一个异常。
    java.lang.NullPointerException:尝试调用虚拟方法'void com.example.aiox.shippies.SetupView.update(int[])'在空对象引用上
    我做了完全相同的事情,这导致了一个例外我遵循了您提到的每个步骤,但仍然没有任何更改。我还必须声明一个新的int[]我的视图类中包含元素的数组,因为在第一次打开时,它尝试读取空数组,应用程序崩溃。执行此操作后,什么也没有发生。程序与以前一样工作正常,实际网格在游戏类中更新,但不会再次更改视图类的数组元素。此外,游戏类中的更新方法看起来像s未使用(带下划线和灰色),这可能与此有关吗?game类中的update()方法非常重要。它将更新传递给View类。更改数组后,您需要做的是调用game class.mView.update(gameGrid)的更新方法;//这是将数组传递给view类所必需的。请参阅代码的第二点,您正在处理和应用对数组的更改。在更改arrayOkay后调用Game类的update()方法,我做了这些,但现在有一个例外