简体   繁体   中英

Passing argument from a DialogFragment to Fragment

I am running into an issue where I would like to pass a Set from a DialogFragment back to the Fragment that calls it initially.

I have tried implementing an interface but I cannot seem to get it to work properly from the Fragment.

Is there another way to arguments from a DialogFragment >> Fragment ? Or would I need to implement the interface on the Activity , and then move it from there?

The issue seems to be a NullPointerException , and I am pretty sure it is because the interface needs to be implemented on the Activity level, and not on the Fragment. The crash occurs when hitting the "Positive Button" for the dialog.

DIALOGFRAGMENT

public class CustomPermissionDialog extends DialogFragment implements
    OnCheckedChangeListener {

String _permission;
View convertView;
AlertDialog.Builder builder;
Switch alertDelete;
Set<String> permSet = new TreeSet<String>();

public static interface OnCompleteDialogInterface {
    public abstract void OnCompleteDialog(Set mPermSet);
}

private OnCompleteDialogInterface mInterface;

public CustomPermissionDialog(Context context, String permissionName) {

    _permission = permissionName;
    mInterface = (OnCompleteDialogInterface) getActivity();
    // TODO Auto-generated constructor stub
}

public Dialog onCreateDialog(Bundle savedInstanceState) {

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

    if (_permission == "Alerts") {
        convertView = (View) inflater
                .inflate(
                        getResources().getLayout(
                                R.layout.alerts_perm_dialog), null);
        alertDelete = (Switch) convertView
                .findViewById(R.id.switchAlertDelete);
        alertDelete.setOnCheckedChangeListener(this);

    }
    if (_permission == "Automation") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.automation_perm_dialog),
                null);

    }
    if (_permission == "Books") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.books_perm_dialog), null);

    }

    if (_permission == "Codes") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.codes_perm_dialog), null);

    }

    if (_permission == "DBS") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.dbs_perm_dialog), null);

    }
    if (_permission == "Feedback") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.feedback_perm_dialog),
                null);

    }

    if (_permission == "Groups") {
        convertView = (View) inflater
                .inflate(
                        getResources().getLayout(
                                R.layout.groups_perm_dialog), null);

    }

    if (_permission == "Inventory") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.inventory_perm_dialog),
                null);

    }

    if (_permission == "Jobs") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.jobs_perm_dialog), null);

    }

    if (_permission == "Locations") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.locations_perm_dialog),
                null);

    }

    if (_permission == "Logs") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.logs_perm_dialog), null);

    }

    if (_permission == "Messages") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.messages_perm_dialog),
                null);

    }

    if (_permission == "Services") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.services_perm_dialog),
                null);

    }
    if (_permission == "Settings") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.settings_perm_dialog),
                null);

    }
    if (_permission == "Templates") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.templates_perm_dialog),
                null);

    }
    if (_permission == "Tools") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.tools_perm_dialog), null);

    }
    if (_permission == "Updates") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.updates_perm_dialog),
                null);

    }
    if (_permission == "Users") {
        convertView = (View) inflater.inflate(
                getResources().getLayout(R.layout.users_perm_dialog), null);

    }

    // defining the alertdialog
    builder.setTitle(_permission + " Permissions");

    builder.setView(convertView);
    builder.setPositiveButton(R.string.accept,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // do something with the new note
                    mInterface.OnCompleteDialog(permSet);

                }
            }).setNegativeButton(R.string.cancel,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // User cancelled the dialog
                }
            });

    return builder.create();
}

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    // TODO Auto-generated method stub
    if (alertDelete.isChecked()) {
        // The toggle is enabled
        permSet.add("alert_delete");
        Log.e("ALERTDELETE", "CHECKED");
    } else {
        // The toggle is disabled
        permSet.remove("alert_delete");
        Log.e("ALERTDELETE", "UNCHECKED");
    }

}

}

INSIDE THE FRAGMENT

    @Override
public void OnCompleteDialog(Set mPermSet) {
    // TODO Auto-generated method stub
    this.permSet = mPermSet;
    String tempPermString = permSet.toString();
    Log.e("PERMISSIONS", tempPermString);

}

STACKTRACE

    10-30 11:41:30.081: E/AndroidRuntime(16925): FATAL EXCEPTION: main
10-30 11:41:30.081: E/AndroidRuntime(16925): Process: com.e.main, PID: 16925
10-30 11:41:30.081: E/AndroidRuntime(16925): java.lang.NullPointerException
10-30 11:41:30.081: E/AndroidRuntime(16925):    at com.e.dialog.CustomPermissionDialog$1.onClick(CustomPermissionDialog.java:171)
10-30 11:41:30.081: E/AndroidRuntime(16925):    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
10-30 11:41:30.081: E/AndroidRuntime(16925):    at android.os.Handler.dispatchMessage(Handler.java:102)
10-30 11:41:30.081: E/AndroidRuntime(16925):    at android.os.Looper.loop(Looper.java:136)
10-30 11:41:30.081: E/AndroidRuntime(16925):    at android.app.ActivityThread.main(ActivityThread.java:5105)
10-30 11:41:30.081: E/AndroidRuntime(16925):    at java.lang.reflect.Method.invokeNative(Native Method)
10-30 11:41:30.081: E/AndroidRuntime(16925):    at java.lang.reflect.Method.invoke(Method.java:515)
10-30 11:41:30.081: E/AndroidRuntime(16925):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
10-30 11:41:30.081: E/AndroidRuntime(16925):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)

Your null pointer is due to trying to set mInterface in the constructor of your DialogFragment using getActivity() . getActivity() at this point in the fragment's lifecycle is null.

Try setting it in onCreate or just cast the activity as the interface when you call it (assuming your activity is guaranteed to implement your interface)

((OnCompleteDialogInterface) getActivity()).OnCompleteDialog(permSet);

Another issue is that your string comparisons are all wrong. You should be using

if (_permission.equals("whatever"))

Second you should be using if/else statements to check your _permission string to avoid unnecessary checks.

Additionally, fragment's should have empty constructors. You should look how to pass your _permissions string using the .setArgument(bundle) method for fragments

Your layout inflation is a bit over-complicated

Instead of

 convertView = (View) inflater.inflate(getResources().getLayout(R.layout.jobs_perm_dialog), null);

You can just be using

 convertView = inflater.inflate(R.layout.jobs_perm_dialog, null);

Your dialog doesn't have an activity yet in the constructor, so calling getActivity() there will return null. Move the initialization of mInterface to onCreateDialog() .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM