有没有办法从我的 Dialog 片段中的 Activity 调用方法?
Posted
技术标签:
【中文标题】有没有办法从我的 Dialog 片段中的 Activity 调用方法?【英文标题】:Is there a way to call a method from my Activity in my Dialog fragment? 【发布时间】: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;
【问题讨论】:
【参考方案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 种方法解决此问题。
-
在 GameActivity 中声明对话框,以便您可以直接调用它的方法。
传递类似于onClickListener的接口。
将活动对象作为构造函数参数传递,并公开猜测方法。
【讨论】:
以上是关于有没有办法从我的 Dialog 片段中的 Activity 调用方法?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法使用''auth REST API''从我的firebase auth用户那里获得“emailVerified”?