使用 DialogFragment 验证用户输入

Use DialogFragment to Validate User Entry

我有一个 FragmentA,它有按钮 DoSomething 和一个侦听器,它是 ActivityA。 FragmentA 还定义了一个带有方法 doSomething() 的 InterfaceA。

ActivityA 实现了 InterfaceA,如下所示显示了 FragmentA(上面有按钮 DoSomething)。

这是在 ActivityA 侦听器中点击 DoSomething 按钮的背后代码:

@Override
public void doSomething(View v) {
  if (hasRight == false){
    // doShowPINDialogFragment just creates and shows PINDialogFragment
    // as per code below.
    // Question 1: How to make doShowPINDialogFragment() return boolean?
    if (doShowPINDialogFragment() == false){ 
        return;
    }
  }

  // If I put break point here, I would expect to see my dialog fragment
  // created in doShowPINDialogFragment() call above but I dont.
  // I see fragment B loaded (replacing FragmentA), then my
  // PINDialogFragment shows on top of it. 
  // Question 2: How to prevent loading fragment B before user enters
  // correct PIN?
  loadFragmentB();  

}

方法 doShowPINDialogFragment() 将简单地创建和 "show" 片段:

public void doShowPINDialogFragment(String a){
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    Fragment prev = getFragmentManager().findFragmentByTag("doShowPINDialogFragment");
    if (prev != null){
        ft.remove(prev);
    }
    ft.addToBackStack(null);
    PINDialogFragment pinDialogFragment = PINDialogFragment.newInstance(a);
    pinDialogFragment.show(ft, "doShowPINDialogFragment");
}

问题是 Android 在显示对话框时不会阻塞(就像 C# 中的 ModalDialog 一样)。因此,上面的方法将在显示我的 PINDialogFragment 之前完全执行。我想阻止调用 loadFragmentB() 但仅在 PINDialogFragment returns true 时调用它。

我的问题是我不知道两件事:

  1. 如何使上面的doShowPINDialogFragment() return true or false?

  2. 如果 doShowPINDialogFragment() returns false,如何防止调用 loadFragmentB()?

我在想写这样的东西可以解决我的 2 个问题:

@Override
public void doSomething(View v) {
  if (hasRight == false){
    if (doShowPINDialogFragment() == false){ 
        return;
    } else {
      loadFragmentB();
    }
  }
}

非常感谢。

我想通了。

与其像上面这样写,不如这样做:

@Override
public void doSomething(View v) {
  if (hasRight == false){
    doShowPINDialogFragment();
  } else {
    loadFragmentB(); 
  } 
}

这样,您仅在 hasRight!=false 时才加载 FragmentB。但是,如果为 false,您将调用 doShowPINDialogFragment() 创建并显示对话框片段,如上文所述。

它还定义了带有回调的接口,然后在与上述代码相同的 java 文件中执行。该回调在肯定按钮单击时触发,并且还将调用 loadFragmentB()。