2014-10-30 92 views
0

我遇到了一个问题,我想将SetDialogFragment回传给最初调用它的Fragment将参数从DialogFragment传递到片段

我已经尝试过实现一个接口,但我似乎无法让它从片段中正常工作。

是否有另一种方法来自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"); 
    } 

} 

} 

INSIDE片段

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

} 

堆栈跟踪

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

您是否考虑使用应用程序类? – 2014-10-30 15:45:02

+0

我没有。我创建了一个,但我不确定要采取哪些步骤才能使其按需执行。 – 2014-10-30 15:48:18

+0

当您回到片段时,将所需信息存储在全局变量中,您可以从该变量中检索数据 – 2014-10-30 15:51:05

回答

0

你d ialog在构造函数中还没有活动,因此调用getActivity()时会返回null。将mInterface的初始化移至onCreateDialog()

1

您的空指针是由于您试图在DialogFragment的构造函数中使用getActivity()来设置mInterfacegetActivity()此时片段的生命周期为空。

尝试在onCreate设置,或只投活动的界面,当你把它(假设你的活动是保证实现您的接口)

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

的另一个问题是,你的字符串比较都是错误的。您应该使用

if (_permission.equals("whatever")) 

其次,你应该使用if/else语句来检查你的_permission字符串,以避免不必要的检查。

此外,片段应该有空的构造函数。你应该看看如何使用片段

.setArgument(bundle)方法

您的布局通胀是有点过于复杂

而不是

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

你可以只使用

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

我改变了很多我的代码。谢谢你的提示和良好的做法。 – 2014-10-30 16:27:35