Невозможно запустить приложение project из Android Studio на мое внешнее устройство

#java #android #xml #android-studio #android-studio-3.0

#java #Android #xml #android-studio #android-studio-3.0

Вопрос:

Итак, я только начал использовать Android Studio для разработки простого приложения для игры в крестики-нолики для проекта колледжа, однако я продолжаю сталкиваться с той же ошибкой при запуске моего проекта на моем внешнем телефоне Huawei P10 Lite. Я провел некоторые поиски в Интернете, но не могу найти решение и не могу запустить эмулятор AVD, потому что мой ноутбук не способен одновременно обрабатывать Android Studio и эмулятор. Любая помощь будет оценена.

Вот ошибка:

 2021-02-17 19:55:00.474 28009-28009/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tictactoe, PID: 28009
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tictactoe/com.example.tictactoe.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3303)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3411)
    at android.app.ActivityThread.-wrap12(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1994)
    at android.os.Handler.dispatchMessage(Handler.java:108)
    at android.os.Looper.loop(Looper.java:166)
    at android.app.ActivityThread.main(ActivityThread.java:7529)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
    at com.example.tictactoe.MainActivity.onCreate(MainActivity.java:39)
    at android.app.Activity.performCreate(Activity.java:7383)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3256)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3411) 
    at android.app.ActivityThread.-wrap12(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1994) 
    at android.os.Handler.dispatchMessage(Handler.java:108) 
    at android.os.Looper.loop(Looper.java:166) 
    at android.app.ActivityThread.main(ActivityThread.java:7529) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) 
 

Вот мой основной код:

 package com.example.tictactoe;


import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button[][] buttons = new Button[3][3];

private boolean player1Turn = true;

private int roundCount;

private int player1Points;
private int player2Points;

private TextView textViewPlayer1;
private TextView textViewPlayer2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textViewPlayer1 = findViewById(R.id.text_view_p1);
    textViewPlayer2 = findViewById(R.id.text_view_p2);

    for (int i = 0; i < 3; i  ) {
        for (int j = 0; j < 3; j  ){
            String buttonID = "button_"   i   j;
            int resID = getResources().getIdentifier(buttonID, "ID", getPackageName());
            buttons[i][j] = findViewById(resID);
            buttons[i][j].setOnClickListener(this);
        }
    }

    Button buttonReset = findViewById(R.id.button_reset);
    buttonReset.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            resetGame();
        }
    });
}

@Override
public void onClick(View v) {
    if (!((Button) v).getText().toString().equals("")) {
        return;
    }

    if (player1Turn) {
        ((Button) v).setText("X");
    } else {
        ((Button) v).setText("O");
    }

    roundCount  ;

    if (checkForWin()) {
        if (player1Turn) {
            player1Wins();
        } else {
            player2Wins();
        }
    } else if (roundCount == 9) {
        draw();
    } else {
        player1Turn = !player1Turn;
    }
}

private boolean checkForWin() {
    String[][] field = new String[3][3];

    for (int i = 0; i < 3; i  ) {
        for (int j = 0; j < 3; j  ) {
            field[i][j] = buttons[i][j].getText().toString();
        }
    }

    for (int i = 0; i < 3; i  ) {
        if (field[i][0].equals(field[i][1])
               amp;amp; field[i][0].equals(field[i][2])
               amp;amp; !field[i][0].equals("")) {
            return true;
        }
    }

    for (int i = 0; i < 3; i  ) {
        if (field[0][i].equals(field[1][i])
                amp;amp; field[0][i].equals(field[2][i])
                amp;amp; !field[0][i].equals("")) {
            return true;
        }
    }

    if (field[0][0].equals(field[1][1])
            amp;amp; field[0][0].equals(field[2][2])
            amp;amp; !field[0][0].equals("")) {
        return true;
    }

    if (field[0][2].equals(field[1][1])
            amp;amp; field[0][2].equals(field[2][0])
            amp;amp; !field[0][2].equals("")) {
        return true;
    }

    return false;
}

private void player1Wins() {
    player1Points  ;
    Toast.makeText( this, "Player 1 Wins!", Toast.LENGTH_SHORT).show();
    updatePointsText();
    resetBoard();
}

private void player2Wins() {
    player2Points  ;
    Toast.makeText( this, "Player 2 Wins!", Toast.LENGTH_SHORT).show();
    updatePointsText();
    resetBoard();
}

private void draw() {
    Toast.makeText( this, "Draw!", Toast.LENGTH_SHORT).show();
    resetBoard();
}

private void updatePointsText() {
    textViewPlayer1.setText("Player 1: "   player1Points);
    textViewPlayer2.setText("Player 2: "   player2Points);
}

private void resetBoard() {
    for (int i = 0; i < 3; i  ) {
        for(int j = 0; j < 3; j  ) {
            buttons[i][j].setText("");
        }
    }

    roundCount = 0;
    player1Turn = true;
}

private void resetGame() {
    player1Points = 0;
    player2Points = 0;
    updatePointsText();
    resetBoard();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putInt("roundCount", roundCount);
    outState.putInt("player1Points", player1Points);
    outState.putInt("player2Points", player2Points);
    outState.putBoolean("player1Turn", player1Turn);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    roundCount = savedInstanceState.getInt( "roundCount");
    player1Points = savedInstanceState.getInt( "player1Points");
    player2Points = savedInstanceState.getInt( "player2Points");
    player1Turn = savedInstanceState.getBoolean( "player1Turn");
}
 

}

Вот мой XML-код:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@ id/text_view_p1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:freezesText="true"
        android:text="Player 1: 0"
        android:textSize="30sp" />

    <TextView
        android:id="@ id/text_view_p2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@ id/text_view_p1"
        android:freezesText="true"
        android:text="Player 2: 0"
        android:textSize="30sp" />

    <Button
        android:id="@ id/button_reset"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="33dp"
        android:text="reset" />

</RelativeLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1">

    <Button
        android:id="@ id/button_00"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:freezesText="true"
        android:textSize="60sp" />

    <Button
        android:id="@ id/button_01"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:freezesText="true"
        android:textSize="60sp" />

    <Button
        android:id="@ id/button_02"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:freezesText="true"
        android:textSize="60sp" />


</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1">

    <Button
        android:id="@ id/button_10"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:freezesText="true"
        android:textSize="60sp" />

    <Button
        android:id="@ id/button_11"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:freezesText="true"
        android:textSize="60sp" />

    <Button
        android:id="@ id/button_12"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:freezesText="true"
        android:textSize="60sp" />


</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1">

    <Button
        android:id="@ id/button_20"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:freezesText="true"
        android:textSize="60sp" />

    <Button
        android:id="@ id/button_21"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:freezesText="true"
        android:textSize="60sp" />

    <Button
        android:id="@ id/button_22"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:freezesText="true"
        android:textSize="60sp" />


</LinearLayout>

</LinearLayout>
 

Любая помощь или указания? Я совсем новичок в Java-кодировании.
Спасибо

Ответ №1:

Ваша проблема в этой строке

 int resID = getResources().getIdentifier(buttonID, "ID", getPackageName());
 

замените "ID" на действительное defType имя "id" , и оно будет работать нормально