Невозможно передать данные из AppCompatDialogFragment во фрагмент (NullPointerException) - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь передать данные Cloud Firestore из моего диалогового окна предупреждения во фрагмент. Данные Firestore хранятся в виде списка. Я могу прочитать данные Firestore, когда щелкаю элемент внутри моего списка, но не могу передать его фрагменту через интерфейс.

Что я пробовал:

Я пытался сделать classi c связь между двумя фрагментами (Alert Dialog Fragment и Fragment). Я хочу передать данные из ListView во фрагмент с использованием интерфейса.

С какими ошибками я сталкиваюсь: в настоящее время я сталкиваюсь с "Попытка вызвать метод интерфейса для ссылки на нулевой объект"

My Код:

   private SendData listener;

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //   System.out.println(arrayList.get(position));

            String item_name = arrayList.get(position);

            db.collection("FoodName").document(item_name).get()
                    .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                        @Override
                        public void onSuccess(DocumentSnapshot documentSnapshot) {

                             String calories =  documentSnapshot.getString(CALORIES);
                             listener.ApplyData(calories);
                        }
                    });

public interface SendData
 {
     void ApplyData (String calories);
 }


@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    try {
         listener = (SendData) context;
    }
    catch (ClassCastException e)
    {
        System.out.println("onAttach: ClassCastException : " + e.getMessage());
    }

Полный журнал ошибок:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.smartmove, PID: 25860
    java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.smartmove.AlertDialogFoodList$SendData.ApplyData(java.lang.String)' on a null object reference
        at com.example.smartmove.AlertDialogFoodList$2$1.onSuccess(AlertDialogFoodList.java:109)
        at com.example.smartmove.AlertDialogFoodList$2$1.onSuccess(AlertDialogFoodList.java:103)
        at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Вы можете передать слушателя после создания AlertDialog.

mDialog.setListener(this);

В вашем классе AlterDialog,

public void setListener(SendData listener){
   this.listener = listener;
}
0 голосов
/ 03 февраля 2020

Итак, когда вы ожидаете связи между Fragment и DialogFragment, идеальным способом будет установить целевой Fragment. Таким образом, вы можете передать ответ из DialogFragment во Fragment. Проверьте код ниже:

Ваш интерфейс:

public interface SendData
{
     void ApplyData (String calories);
}

Ваш фрагмент:

public class MainFragment extends Fragment implements SendData {

    private void showDialogFragment() {
        DialogFragment dialogFrag = MainDialogFragment();
        dialogFrag.setTargetFragment(this, 123);
        dialogFrag.show(getFragmentManager, "MainDialogFragment");
    }

    @override
    public void ApplyData(String calories){

    }
}

Ваш DialogFragment:

public class MyialogFragment extends DialogFragment {

    private SendData sendData;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        Fragment fragment = getTargetFragment();
        if (fragment instanceof SendData) {
            sendData = (SendData) fragment;
        } else {
            throw new RuntimeException("Target Fragment is not implementing SendData interface");
        }
    }
}

Это должно работать!

...