使用DialogFragment验证用户输入

时间:2015-07-21 00:13:56

标签: android android-dialogfragment dialogfragment

我有一个FragmentA,它有一个按钮DoSomething和一个监听器,它是ActivityA。 FragmentA还定义了一个InterfaceA,其中包含方法doSomething()。

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()将简单地创建和"显示"片段:

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在显示Dialog时不会阻塞(就像C#中的ModalDialog一样)。因此,上面的方法将在显示我的PINDialogFragment之前完全执行。我想阻止调用loadFragmentB(),但只在PINDialogFragment返回true时才调用它。

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

  1. 如何使上面的doShowPINDialogFragment()返回true或false?

  2. 如果doShowPINDialogFragment()返回false,如何阻止对loadFragmentB()的调用?

  3. 我认为写这样的东西可以解决我的两个问题:

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

    非常感谢。

1 个答案:

答案 0 :(得分:0)

我明白了。

不要像上面那样写,请执行以下操作:

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

这样,只有当hasRight!= false时才会加载.FragmentB。但是,如果为false,则调用doShowPINDialogFragment(),它会创建并显示对话框片段,如上所述。

它还定义了一个回调接口,然后在与上面的代码相同的java文件中执行。该回调在正向按钮点击时触发,并且还将调用loadFragmentB()。