5

我有一个从 DialogFragment 派生的自定义对话框。

当用户单击“确定”按钮时,我需要保存屏幕上的信息。

所以我让我的 PositiveButton 调用关闭,我实现了 onDismiss 方法来保存数据。

在 onDismiss 方法中,我需要从对话框上的 editView 获取数据。我正在使用getView().findViewByID 来获取editView,但是GetView() 方法返回null。

这是我的代码:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();

    builder.setView(inflater.inflate(R.layout.dialog_signin, null))
           .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   LoginDialogFragment.this.getDialog().dismiss();
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   LoginDialogFragment.this.getDialog().cancel();
               }
           });      
    return builder.create();
}

@override
public void onDismiss(){
    EditView view = (EditView)getView().findViewByID(R.id.edit);
}

我知道我可以将 OnCreateDialog 中膨胀的视图保存为属性,但这对我来说似乎不合适。

从 onDismiss 中的屏幕获取视图的正确方法是什么?

Ps:我工作的地方不允许我发布我的代码,所以我从谷歌拿了一个代码,我把它改成了尽可能接近我的代码。

4

2 回答 2

3

我登录的DialogFragment方式是对片段的父活动使用回调方法,如下所示:

builder.setPositiveButton("Login", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                EditText username = (EditText) getDialog().findViewById(R.id.username);
                EditText password = (EditText) getDialog().findViewById(R.id.password);                 

                un = username.getText().toString();
                pw = password.getText().toString();

                    if (un.equals("") || pw.equals("")) {
                        Toast.makeText(getActivity(), "Username or Password field was empty", Toast.LENGTH_SHORT).show();
                        //Don't login & do something (I made a recursive callback to the fragment that created the dialog)
                    }
                    else if (!un.equals("username") || !pw.equals("password")) {
                        Toast.makeText(getActivity(), "Username or Password was incorrect", Toast.LENGTH_SHORT).show();
                        //Don't login & do something (I made a recursive callback to the fragment that created the dialog)
                    }
                    else if (un.equals("username") && pw.equals("password")) {
                        Toast.makeText(getActivity(), "You have logged in successfully", Toast.LENGTH_SHORT).show();
                        mLogin.Login();
                    }

然后回调方法Login()将创建下一个需要的片段。

将创建登录对话框的片段将在其回调方法中包含以下代码:

LoginDialog login = new LoginDialog();
login.show(getFragmentManager(), "LOGIN");
于 2013-05-22T21:09:01.157 回答
3

旧但黄金。这允许对整个片段有更大的控制(例如在实现 seekBar 或使用 ButterKnife 时)。说够了:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();

    View view = inflater.inflate(R.layout.dialog_signin, null);
    // do your stuff with views here

    builder.setView(view)
       .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int id) {
               LoginDialogFragment.this.getDialog().dismiss();
           }
       })
       .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               LoginDialogFragment.this.getDialog().cancel();
           }
       });      
    return builder.create();
}

我知道我可以将 OnCreateDialog 中膨胀的视图保存为属性,但这对我来说似乎不正确。

是的,就是这个。但它看起来是正确的,尤其是在实现诸如 seekBar 之类的东西以及使用诸如 ButterKnife 之类的库时。

于 2015-10-24T13:04:10.747 回答