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.