5

Tôi đang cố gắng gửi một số dữ liệu từ dialogfragment đến mục tiêu fragment nhưng không hoạt động.Gọi lại DialogFragment đến Phân đoạn mục tiêu bằng giao diện

Tôi đã viết đoạn code sau, nhưng nó thông qua exception:

java.lang.NullPointerException: Attempt to invoke interface method 'void com.x.x.FragmentAlertDialog$Communicator.setI(java.lang.String)' on a null object reference 

Code:

public class FragmentAlertDialog extends DialogFragment { 

Communicator callback; 

public interface Communicator { 
    void setI(String name); 
} 

public static FragmentAlertDialog newInstance(String id, int title, int items) { 
    FragmentAlertDialog frag = new FragmentAlertDialog(); 
    Bundle args = new Bundle(); 
    args.putString("id", id); 
    args.putInt("title", title); 
    args.putInt("items", items); 
    frag.setArguments(args); 
    return frag; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    callback = (Communicator) getTargetFragment(); 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    String id = getArguments().getString("id"); 
    int title = getArguments().getInt("title"); 
    String[] items = getResources().getStringArray(getArguments().getInt("items")); 
    switch (id) { 
     case MainActivity.DIALOG_1: 
      return new AlertDialog.Builder(getActivity()) 
        .setTitle(title) 
        .setItems(items, new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          callback.setI("Important Data"); 
         } 
        }).create(); 
    } 
    return null; 
} 

Fragment Lớp

public class FragmentXYXY extends Fragment implements View.OnClickListener, FragmentAlertDialog.Communicator { 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.et_i: 
      DialogFragment newFragment = FragmentAlertDialog.newInstance(MainActivity.DIALOG_I, R.string.i_select, R.array.i_array); 
      newFragment.setTargetFragment(this, 0); 
      newFragment.show(getFragmentManager(), "dialog"); 
    } 
} 

@Override 
public void setI(String name) { 
    textI.setText(name); 
} 

thể ai xin vui lòng giúp đỡ. Cảm ơn bạn

Mã Modified- newFragment.setTargetFragment (this, 0);

+0

liều getTargetFragment(); phương pháp nào? –

+0

một phương pháp xây dựng trong phương pháp, tôi đang cố gắng lấy đoạn mà hộp thoại được tạo ra – ThunderRoid

Trả lời

6

bạn phải gọi setTargetFragment

setTargetFragment(this, 0); 

để có được một tài liệu tham khảo FragmentXYXY, trong số DialogFragment của bạn.

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.et_i: 
      DialogFragment newFragment = FragmentAlertDialog.newInstance(MainActivity.DIALOG_I, R.string.i_select, R.array.i_array); 
      newFragment.setTargetFragment(this, 0); 
      newFragment.show(getFragmentManager(), "dialog"); 
    } 
} 
+0

lỗi - android.support.v4.app.SuperNotCalledException: Fragment FragmentAlertDialog {20927aee # 1 dialog} không gọi tới super.onAttach() – ThunderRoid

+0

* không gọi tới super.onAttach() * – Blackbelt

+0

cũng đã thử điều này, không đang hoạt động ------ @Override void công khai onAttach (Hoạt động hoạt động) { callback = (Communicator) getTargetFragment(); } – ThunderRoid

3

Ví dụ, bạn có thể làm điều đó như vậy:

public interface DialogClickListener { 
    public void onYesClick(); 
    public void onNoClick(); 
} 


public class MyListFragment extends ListFragment implements DialogClickListener { 

    ... 

    private void showDialog() { 
     DialogFragment dialog = new MyDialogFragment(); 
     dialog.setTargetFragment(this, 0); 
     dialog.show(getFragmentManager(), "dialog"); 
    } 

    @Override 
    public void onYesClick() { 
     // do something 
    } 

    @Override 
    public void onNoClick() { 
     // do something 
    } 
} 


public class MyDialogFragment extends DialogFragment { 
    private DialogClickListener callback; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     try { 
      callback = (DialogClickListener) getTargetFragment(); 
     } catch (ClassCastException e) { 
      throw new ClassCastException("Calling fragment must implement DialogClickListener interface"); 
     } 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setMessage("message") 
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int id) { 
         callback.onYesClick(); 
        } 
       }).setNegativeButton("No", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int id) { 
         callback.onNoClick(); 
        } 
       }); 

     return builder.create(); 
    } 
} 

để xem chi tiết chỉ cần tham khảo này link

+0

vẫn lỗi tương tự java.lang.NullPointerException: Cố gắng gọi phương thức giao diện 'void com.xxFragmentAlertDialog $ Communicator.setI (java.lang .String) 'trên tham chiếu đối tượng null – ThunderRoid

+0

nhận xét dòng này gọi lại = (Communicator) getTargetFragment(); –

+0

không hoạt động - java.lang.ClassCastException: com.x.x.MainActivity không thể truyền sang com.x.x.FragmentAlertDialog $ Communicator – ThunderRoid

Các vấn đề liên quan