5

Próbuję przesłać niektóre dane z dialogfragment do docelowego fragment, ale nie działa.oddzwonienie do fragmentu docelowego za pomocą interfejsu

Napisałem następujący kod, ale to przez exception:

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

Kod:

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 Klasa

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

Może ktoś proszę o pomoc. Dziękujemy

Kod Zmodyfikowany - newFragment.setTargetFragment (this, 0);

+0

jaka dawka getTargetFragment(); metoda zrobić? –

+0

jest to metoda kompilacji, próbuję uzyskać fragment, w którym jest tworzone okno dialogowe – ThunderRoid

Odpowiedz

6

trzeba zadzwonić setTargetFragment

setTargetFragment(this, 0); 

w celu uzyskania odniesienie FragmentXYXY, w twoim DialogFragment.

@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

error - android.support.v4.app.SuperNotCalledException: Fragment FragmentAlertDialog {20927aee # 1 dialog} nie zadzwonił do super.onAttach() – ThunderRoid

+0

* nie zadzwonił do super.onAttach() * – Blackbelt

+0

również próbował tego, nie działa ------ @Override public void onAttach (Activity activity) { callback = (Communicator) getTargetFragment(); } – ThunderRoid

3

Na przykład, można to zrobić tak:

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

o szczegóły tylko odnieść to link

+0

nadal ten sam błąd java.lang.NullPointerException: Próba wywołania metody interfejsu 'void com.xxFragmentAlertDialog $ Communicator.setI (java.lang .String) "w odwołaniu do obiektu o wartości zerowej – ThunderRoid

+0

skomentuj tę linię callback = (Communicator) getTargetFragment(); –

+0

nie działa - java.lang.ClassCastException: com.x.x.MainActivity nie można przesłać do com.x.x.FragmentAlertDialog $ Communicator – ThunderRoid