在Android中调用登录对话框的最佳实践

时间:2015-07-21 17:41:45

标签: android android-fragments

我正在构建一个Android应用程序,该应用程序有一个开放的部分和一些需要身份验证的操作。

我所做的是当用户点击需要身份验证的操作时,显示登录对话框,用户可以登录,登录有效30分钟。

所以我在一个片段中有3个按钮,当点击时检查用户是否已登录,如果没有,则调用登录对话框。

问题是:如何识别单击了哪个按钮,因为当用户单击按钮并且未经过身份验证时,我只需创建登录对话框并将setTargetFragment设置为调用者片段,这对于3个按钮是相同的

有没有办法将参数传递给登录对话框来识别?

代码如下:

当用户点击按钮时:

final DialogFragment loginDialog = new LoginDialogFragment();
loginDialog.setTargetFragment(this, 0);

btnAprovar.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (!LoginService.getInstance().isLoggedOn()) {
            loginDialog.show(getFragmentManager(), "Login");
        }
    }
});

在对话框中:

 @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View v = inflater.inflate(R.layout.fragment_login_dialog, null);
    final EditText txtUser = (EditText) v.findViewById(R.id.txtUsername);
    final EditText txtPwd = (EditText) v.findViewById(R.id.txtPassword);
    builder.setView(v)
            .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    DoLogin dl = new DoLogin();
                    dl.execute(txtUser.getText().toString(), txtPwd.getText().toString());
                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    LoginDialogFragment.this.getDialog().cancel();
                }
            });
    return builder.create();
}

private void DoPost(Boolean _result) {
    if (_result.equals(true)) {
        ((PublicacaoDetailFragment) this.getTargetFragment()).onAuthTrue();
    } else {
        ((PublicacaoDetailFragment) this.getTargetFragment()).onAuthFalse();
    }
}

这样做的最佳做法是什么?

由于

2 个答案:

答案 0 :(得分:1)

要扩展@ Rodolfo的答案,你应该在这里使用装饰器/包装器模式。

在LoginDialogFragment中,您应该只拥有DialogFragment的实例变量,而不是扩展DialogFragment。这样,您可以使用名为show(String buttonDescription)的方法。在您自己的show(...)方法中,您可以调用DialogFragment的show()方法。

答案 1 :(得分:0)

由于您在自己的课程中扩展DialogFragment,因此您有两种选择:

  • 在自定义Dialog类中定义变量(带有getter和/或setter)。在您的登录按钮onClick方法中,在致电show()的{​​{1}}之前,请调用此变量的setter并传递Dialog。在这种情况下,v.getId()是与您添加v的组件相关联的View
  • OnClickListener内的View个按钮传递给Bundle