无法在对话框片段中使用 运行 Activity 方法

Unable to run Activity method in Dialog Fragment

我正在 Android Studio 使用 Java 制作刽子手游戏。我有一个“猜测”按钮,它会打开一个包含编辑文本和两个按钮的对话框。其中一个按钮是确认猜测,因此它获取输入的文本 (guessedWord) 并将其与刽子手单词 (wordToGuess) 进行比较。如果错误,它会添加一张图片,如果正确,则用户赢得游戏。比较单词的方法在我的 activity (GameActivity.java) 中,但按下按钮在我的对话框片段 (GuessWord.java) 中。我试图在对话框片段中调用方法 runGuessWord(),但是当我单击确认按钮时出现错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.hangman.GameActivity.guessWord()' on a null object reference

我尝试使用 getter 和 setter 发送输入的文本。代码如下:

GameActivity.java

public class GameActivity extends AppCompatActivity {
    private GuessWord guessWord;
    public int wrongGuesses = 0;
    public String wordToGuess;

    private void openGuessDialog() {
        guessWord = GuessWord.newInstance();
        guessWord.show(getSupportFragmentManager(), GuessWord.TAG);
    }
    public void runGuessWord() {
        GuessWord guessedWordInput = new GuessWord();
        guessedWordInput.setGuessedWord("");
        guessedWord = guessedWordInput.getGuessedWord();

        if (!guessedWord.equals("")) {
            if (guessedWord.equals(wordToGuess)) {
                gameWin();
            } else {
                wrongGuesses += 1;
                setImage();
                if (wrongGuesses == 7) {
                    gameOver();
                }
            }
        }
    }
}

GuessWord.java:

public class GuessWord extends DialogFragment {
    private GameActivity gameActivity;
    public String guessedWord;
    public EditText guessEntered;
    public static final String TAG = "guess";

    public static GuessWord newInstance() {
        Bundle args = new Bundle();
        GuessWord fragment = new GuessWord();
        fragment.setArguments(args);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.dialog_guess, container);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        setCancelable(false);
        closeGuess();
        confirmGuess();
    }

    private void closeGuess() {
        Button closeGuess = getView().findViewById(R.id.btnCloseGuess);
        closeGuess.setOnClickListener(v -> {
            dismiss();
        });
    }

    private void confirmGuess() {
        Button confirmGuess = getView().findViewById(R.id.btnConfirmGuess);
        EditText guessEntered = getView().findViewById(R.id.etGuess);
        confirmGuess.setOnClickListener(v -> {
            guessedWord = guessEntered.getText().toString().toUpperCase();
            if (guessedWord.equals("")) {
                Toast.makeText(getActivity(), "Please enter a guess!", Toast.LENGTH_SHORT).show();
            } else {
                dismiss();
                System.out.println("Text Input = " + guessedWord);
                gameActivity.runGuessWord();
            }
        });
    }

    public String getGuessedWord() {
        return guessedWord;
    }
    public void setGuessedWord(String guessedWord) {
        this.guessedWord = guessedWord;
    }
}

您没有为 gameActivity 赋值,因此它始终为空。将它添加到您的 DialogFragment

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        gameActivity = ((GameActivity) getActivity());
    }