将数据从 alertDialog 发送回 activity

Sending the data back to the activity from alertDialog

大家好需要一些帮助我创建了一个自定义警报对话框,它接受用户输入,如用户名和密码。我跟着 the android developers site 我想做的是一旦用户输入用户名和密码并按下 alertdialog 中的登录按钮,我想将这些值显示给创建对话框的 activity。我被困在这浪费了 3 个小时。任何帮助将非常感激。这是我的代码。

MainActivity.java

public class MainActivity extends FragmentActivity implements NoticeDialogFragment.NoticeDialogListener{

private Button dialogButton;
private Button customDialogButton;
private TextView customDialogTextview;

private Button dialogWithInterface;
private EditText dialogUsername;
private EditText dialogPassword;
String username;
String password;


public void showNoticeDialog() {
    // Create an instance of the dialog fragment and show it
    DialogFragment dialog = new NoticeDialogFragment();
    dialog.show(getFragmentManager(), "NoticeDialogFragment");

}



// The dialog fragment receives a reference to this Activity through the
// Fragment.onAttach() callback, which it uses to call the following methods
// defined by the NoticeDialogFragment.NoticeDialogListener interface
@Override
public void onDialogPositiveClick(DialogFragment dialog) {
    // User touched the dialog's positive button

}

@Override
public void onDialogNegativeClick(DialogFragment dialog) {
    // User touched the dialog's negative button

}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    customDialogTextview = (TextView)findViewById(R.id.customdialogtext);
    customDialogTextview.setText("Email and Password: ");

    dialogButton = (Button)findViewById(R.id.dialogbutton);
    dialogButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 1. Instantiate an AlertDialog.Builder with its constructor
            final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            // Add the buttons
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // User clicked OK button

                }
            });

            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // User cancelled the dialog
                }
            });

            // 2. Chain together various setter methods to set the dialog characteristics
            builder.setMessage("hello")
                    .setTitle("Dialog");

            // 3. Get the AlertDialog from create()
            AlertDialog dialog = builder.create();
            dialog.show();
        }
    });

    customDialogButton = (Button)findViewById(R.id.customdialogbutton);
    customDialogButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            // Get the layout inflater
            LayoutInflater inflater = MainActivity.this.getLayoutInflater();

            // Inflate and set the layout for the dialog
            // Pass null as the parent view because its going in the dialog layout
            builder.setView(inflater.inflate(R.layout.dialog, null));

            builder.setPositiveButton("Sign In", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //sign in the user
                }
            });

            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

            AlertDialog dialog = builder.create();
            dialog.show();

        }
    });

    dialogWithInterface = (Button)findViewById(R.id.dialogwithinterface);
    dialogWithInterface.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            showNoticeDialog();
        }
    });

}

NoticeDialogFragment.java

public class NoticeDialogFragment extends DialogFragment {


/* The activity that creates an instance of this dialog fragment must
 * implement this interface in order to receive event callbacks.
 * Each method passes the DialogFragment in case the host needs to query it. */
public interface NoticeDialogListener {
    public void onDialogPositiveClick(DialogFragment dialog);
    public void onDialogNegativeClick(DialogFragment dialog);

}

// Use this instance of the interface to deliver action events
NoticeDialogListener mListener;

// Override the Fragment.onAttach() method to instantiate the NoticeDialogListener
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the NoticeDialogListener so we can send events to the host
        mListener = (NoticeDialogListener) activity;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(activity.toString()
                + " must implement NoticeDialogListener");
    }
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Build the dialog and set up the button click handlers

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();

    builder.setView(inflater.inflate(R.layout.dialog, null));
    builder.setPositiveButton("Sign In", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            // Send the positive button event back to the host activity
            mListener.onDialogPositiveClick(NoticeDialogFragment.this);
            Toast.makeText(getActivity(), "positive", Toast.LENGTH_SHORT).show();


        }
    })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // Send the negative button event back to the host activity
                    mListener.onDialogNegativeClick(NoticeDialogFragment.this);
                }
            });
    return builder.create();
}

}

看看你的 activity 实现的这个方法:

@Override
public void onDialogPositiveClick(DialogFragment dialog) {
    // User touched the dialog's positive button
}

它是您在名为 NoticeDialogListener 的对话框中创建的自定义界面的一部分,是您希望对话框与调用它的 activity 进行通信的方式。

public interface NoticeDialogListener {
    public void onDialogPositiveClick(DialogFragment dialog);
    public void onDialogNegativeClick(DialogFragment dialog);
}

更改此设置,使 onDialogPostiveClick 看起来像:

public void onDialogPositiveClick(String name, String password);

并在单击按钮时将 EditText 中的值传递到调用中,如下所示:

builder.setPositiveButton("Sign In", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int id) {
        // Send the positive button event back to the host activity
        mListener.onDialogPositiveClick(mNameEdit.getText().toString(), mPasswordEdit.getText().toString());
    }
});

下一步是使用您在 activity 中为 onDialogPositiveClick() 方法重写的方法中的名称和密码值做任何您想做的事情。

@Override
public void onDialogPositiveClick(String name, String password) {
    //do something with name and password here?
}

这似乎是使用现有代码执行您想执行的操作的最简单方法。