【问题标题】:Is there a way to call a method from my Activity in my Dialog fragment?有没有办法从我的 Dialog 片段中的 Activity 调用方法?
【发布时间】:2021-10-09 13:03:15
【问题描述】:

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

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void com.example.hangman.GameActivity.guessWord()”

我尝试使用 getter 和 setter 来发送输入的文本。下面的代码(更新 - 在活动中包含完整的对话框和更多内容):

GameActivity.java

public class GameActivity extends AppCompatActivity {
    private GuessWord guessWord;

    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;
    }
}

【问题讨论】:

    标签: java android android-activity methods dialog


    【解决方案1】:

    如果您没有使用过这种方式,请尝试在 DialogFragment 类中传递 GameActivity 对象 喜欢

    Class GameActivity{
    
      show dialog(){
         GuesWord(this).show()
       }
    }
    
    class GuesWord{
    
      GameActivit activity
      GuesWord(GameActivit activity){
         this.activity = activity
       }
    
        // Then call the method of GameActivity by using object activity where you want like activity.guesword()
    
    }
    

    或者您也可以尝试使用 Interface 并在 DialogFragment 类中传递接口的匿名对象,然后在 GameActivity 中调用该方法并覆盖以在那里获得进一步的任务

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      在 GuessWord 文件中,gameActivity 变量为空,这就是它显示此类错误的原因。

      “gameActivity”变量在“gameActivity.guessWord();”中不应为空行。

      您可以使用 3 种方法解决此问题。

      1. 在 GameActivity 中声明对话框,以便您可以直接调用它的方法。
      2. 传递类似于onClickListener的接口。
      3. 将活动对象作为构造函数参数传递,并公开猜测方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多