【问题标题】:Why doesn't DialogFragment.dismiss kill the dialog right away?为什么 DialogFragment.dismiss 不立即终止对话框?
【发布时间】:2024-04-18 12:35:02
【问题描述】:

我正在构建一个非常基本的词汇应用程序。我现在正在尝试实现的功能是一个转到功能,即将用户带到一个特定的词汇术语。我通过向用户提示一个询问用户页码的对话框片段来做到这一点。 (对话框片段将通过回调触发,按钮按下) 这是我这样做的代码

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

这是我运行应用程序时的屏幕截图

截图2(截图1之后)

就功能而言,对话框加载良好,能够将用户带到正确的位置。然而,在将用户从第 7 期带到第 5 期的示例中,用户被带到 正确的术语,但对话框没有像 getDialog().dismiss() 那样关闭。我知道正在调用驳回,因为我浏览了代码,并且 communicator.onDialogMessage(pagina) 将正确的术语号返回给活动。当我选择另一个学期编号时,对话框会关闭。有没有人看到这个问题?这对我来说根本没有意义。

要关闭对话框,关闭是正确的方法 - How to correctly dismiss a DialogFragment? 我还尝试了用户在Correct way to remove a DialogFragment: dismiss() or transaction.remove()? 中的建议,即调用executePendingTransactions()。

【问题讨论】:

    标签: java android dialog android-dialog android-dialogfragment


    【解决方案1】:

    如果有人遇到类似问题,我的应用程序的问题是我的 OnTouchListener。 当我设置 OnTouchListener 以触发 DialogFragment 时,这是我这样做的原始代码 goTo - 文本视图

    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 - 最后一个手指已经停止触摸屏幕。因为发生了两个运动事件,所以创建了两个对话片段。这就是为什么在我的情况下必须调用两次以摆脱两个对话片段的原因。我通过对 event.getAction() 进行条件测试来解决此问题

    【讨论】: