使用 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 时调用它。
我的问题是我不知道两件事:
如何使上面的doShowPINDialogFragment() return true or false?
如果 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()。
我有一个 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 时调用它。
我的问题是我不知道两件事:
如何使上面的doShowPINDialogFragment() return true or false?
如果 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()。