2014-10-30 2 views
0

У меня возникла проблема, когда я хотел бы передать Set из DialogFragment обратно в Fragment, который вызывает его изначально.Передача аргумента из диалога DialogFragment to Fragment

Я попытался реализовать интерфейс, но я не могу заставить его нормально работать с Фрагментом.

Есть ли другой способ аргументов от DialogFragment >>Fragment? Или мне нужно реализовать интерфейс на Activity, а затем переместить его оттуда?

Проблема, кажется, NullPointerException, и я уверен, что это потому, что интерфейс должен быть реализован на уровне активности, а не на фрагменте. Авария происходит при нажатии «Положительная кнопка» для диалога.

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

} 

} 

ВНУТРИ ФРАГМЕНТ

@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) 
+0

Считаете ли вы использование класса Application? –

+0

Я этого не сделал.У меня есть один созданный, но я не уверен, какие шаги нужно предпринять, чтобы сделать то, что мне нужно? –

+0

Сохраните необходимую информацию в глобальном var, когда вы вернетесь к фрагменту, который вы можете получить из этого файла. –

ответ

0

Ваш г ialog еще не имеет активности в конструкторе, поэтому при вызове getActivity() возвращается значение null. Переместите инициализацию mInterface на onCreateDialog().

1

Ваш нулевой указатель должен попытаться установить mInterface в конструкторе вашего DialogFragment, используя getActivity(). getActivity() в этой точке жизненного цикла фрагмента имеет значение NULL.

Попробуйте установить его в onCreate или просто бросить свою деятельность в качестве интерфейса при вызове его (предполагая, что ваша деятельность гарантированно реализовать интерфейс)

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

Другая проблема заключается в том, что ваши сравнения строк все неправильно. Вы должны использовать

if (_permission.equals("whatever")) 

Второе следует использовать если/другое заявления, чтобы проверить _permission строку, чтобы избежать ненужных проверок.

Кроме того, фрагмент должен иметь пустые конструкторы. Вы должны смотреть, как передать свою _permissions строку с помощью метода .setArgument(bundle) для фрагментов

Вашей инфляция раскладки немного чрезмерно сложного

Вместо

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

Вы можете просто использовать

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

Я изменил свой код. Спасибо за советы и хорошие практики. –

Смежные вопросы