从alertDialog将数据发送回活动

时间:2015-09-25 15:58:59

标签: java android alertdialog android-dialogfragment

大家好我需要一些帮助我创建了一个自定义alertdialog,它接受用户输入,如用户名和密码。我跟着the android developers site我想要做的是,一旦用户输入用户名和密码并按下alertdialog中的登录按钮,我想将这些值显示给创建对话框的活动。我被困在这浪费了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();
}

}

1 个答案:

答案 0 :(得分:2)

查看您的活动实施的此方法:

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

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

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());
    }
});

下一步是对你在onDialogPositiveClick()方法的活动中覆盖的方法中的名称和密码值做任何你想做的事。

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

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