无法在对话框片段中使用 运行 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());
}
我正在 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());
}