我正在构建一个非常基本的词汇应用程序。我现在尝试实现的功能是转到功能,即将用户带到特定的词汇术语。我这样做是通过向用户提示一个对话框片段,询问用户的页码。 (对话框片段将通过回调触发,按下按钮) 这是我这样做的代码
public class GoToDialog extends DialogFragment{
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String pgn = pageNumber.getText().toString();
if(!isNumeric(pgn) || pgn.isEmpty()) {
Toast.makeText(getActivity(), "Please enter a valid number", Toast.LENGTH_SHORT).show();
} else {
int pagina = Integer.parseInt(pgn);
if(pagina <= 0 || pagina > total) {
Toast.makeText(getActivity(), String.format("Please enter a valid " +
"term number between 0 and %d", total), Toast.LENGTH_SHORT).show();
} else {
getDialog().dismiss();
getFragmentManager().executePendingTransactions();
communicator.onDialogMessage(pagina);
}
}
}
});
以下是我运行应用程序时的屏幕截图
Screenshot2(截屏1后面)
在功能方面该对话框加载正常,并能够将用户带到正确的位置。然而,在将用户从第7项带到第5项的示例中,用户被带到了 正确的术语,但对话框不应该从getDialog()。dismiss()中关闭。我知道dismiss被调用是因为我遍历了代码和communicator.onDialogMessage(pagina)将正确的术语编号返回给活动。当我选择要转到的另一个术语编号时,对话框会关闭。有谁看到这个问题?这对我来说根本没有意义。
要关闭对话框,dismiss是正确的使用方法 - How to correctly dismiss a DialogFragment? 我还尝试了用户在Correct way to remove a DialogFragment: dismiss() or transaction.remove()?中建议的内容,即调用executePendingTransactions()。
答案 0 :(得分:0)
如果有人遇到类似的问题,我的应用程序的问题就是我的OnTouchListener。 当我在OnTouchListener上设置触发DialogFragment时,这是我原来的代码 goTo - TextView
private void setUpGoToTouchListener() {
goTo.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
FragmentManager fm = MainActivity.this.getFragmentManager();
GoToDialog dialog = new GoToDialog();
Bundle bundle = new Bundle();
bundle.putInt("Size", defMan.getTotalCount());
dialog.setArguments(bundle);
dialog.show(fm, "Manager");
return true;
}
});
}
当TextView上出现手势(触摸)时,将生成两个MotionEvents,按下,ACTION_DOWN - 第一个手指触摸屏幕,释放ACTION_UP - 最后一个手指停止触摸屏幕。由于发生了两个运动事件,因此创建了两个对话框片段这就是为什么在我的情况下必须两次调用dismiss来摆脱两个对话框碎片。我通过对event.getAction()
进行条件测试来解决这个问题