2
votes

java.lang.NullPointerException à java.util.Objects.requireNonNull

Dans mon code, j'appelle une fonction addFood comme suit à partir d'une activité

2019-01-15 12:08:37.898 7908-7908/com.example.khali.nutriplan E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.khali.nutriplan, PID: 7908
java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at com.example.khali.nutriplan.postFood.addFood(postFood.java:63)
    at com.example.khali.nutriplan.breakfastPage$1.onClick(breakfastPage.java:114)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access$3100(View.java:778)
    at android.view.View$PerformClick.run(View.java:25885)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

puis le code exécute le code suivant

public class postFood extends DialogFragment {
    @SuppressLint("StaticFieldLeak")
    private static Context context1;
    @SuppressLint("StaticFieldLeak")
    private static ListView dateList1, selectedList1;
    private static ProgressDialog progressDialog;
    private static int mealType1;
    private static String TAG = "AddSelectedFood";
    private static String date;
    private static String time;
    public static String[] dateTimeString;
    public static Calendar cal;


    public  void addFood(Context context, ListView dateList, ListView selectedList,
                           int mealType) {
        dateList1 = dateList;
        selectedList1 = selectedList;
        context1 = context;
        mealType1 = mealType;
        //*FragmentManager manager = Objects.requireNonNull(this.getActivity()).getSupportFragmentManager();

        // Use the current date as the default date in the picker
        new datePickerFragment().show(Objects.requireNonNull(getActivity()).getSupportFragmentManager(), "datePicker");
    }
}

Que puis-je faire pour éviter que getActivity (). GetSuppotFragmentManaget soit nul?

voici mon LOG

postFood f = new postFood();
f.addFood(context, breakfastDate, breakfastSearch, 1);


9 commentaires

vous auriez pu me renseigner plutôt que de simplement voter contre la question ... Pouvez-vous m'aider ??


Je ne connais pas Java, et comme la question n’est pas balisée avec Java, ceux qui connaissent Java sont moins susceptibles de voir votre question. (en d'autres termes, un marquage précis est dans votre propre intérêt :))


Merci pour ça


Premièrement: veuillez partager le logcat. Et en plus de cela, je pense que getActivity () est Null, pas getActivity (). GetSuppotFragmentManaget


Un double possible de getActivity () renvoie null dans la fonction Fragment


vous passez le contexte. si ce contexte appelle une activité, vous pouvez utiliser le contexte à la place de getActivity () pour que getActivity () fonctionne, vous devez d'abord charger le fragment et appeler la méthode après le fragment attaché à acivity.


lorsque je remplace getActivity par le contexte .getSupportFragmentManager () ne fonctionnera pas


j'ai ajouté le journal


Essayez d'utiliser requireActivity () .


3 Réponses :


0
votes

Il est un peu difficile de dire pourquoi getActivity () est nul car nous ne savons pas où vous appelez votre méthode.

Vous devez savoir que getActivity () est nul avant onAttach () et après onDestroy () , si vous appelez votre méthode entre ces deux méthodes, vous devriez être bon.

Que puis-je faire pour empêcher getActivity (). getSuppotFragmentManaget d'être nul?

Répondre brutalement à votre question. Lorsque vous utilisez getActivity () dans votre code, il est recommandé de le convertir pour vous assurer qu'il n'est pas nul (sauf si vous êtes sûr qu'il n'est pas nul). Dans votre code, ce serait comme ça.

    // Use the current date as the default date in the picker
    if (getActivity != null){
        new datePickerFragment().show(Objects.requireNonNull(
            getActivity()).getSupportFragmentManager(), "datePicker");
    }

En les utilisant, vous n'aurez pas le problème getActivity.getSupportFragmentManager () étant nul. MAIS , c'est parce que cette partie de votre code ne fonctionnera plus. Il verra que getActivity () est nul et il ne suivra pas le code.

À partir de maintenant, votre application ne plantera plus, cependant, vous ne verrez pas la boîte de dialogue. Vous devez maintenant empêcher getActivity () d'être nul. Pour cela, je vous recommande de le faire.

  1. Vérifiez où vous appelez votre méthode;
  2. Essayez d'appeler votre méthode à partir d'endroits différents;
  3. Assurez-vous que votre activité / fragment se trouve dans les méthodes onAttach () et onDestroy () lorsque vous utilisez getActivity () . li >


0 commentaires

1
votes

Ok, laissez-moi vous l'expliquer très rapidement. Ce que vaibhav kumar a mentionné dans son commentaire est correct, mais je pense que vous ne l'avez pas encore entièrement compris. L'idée est de transmettre le contexte de l'activité appelante au fragment. Pourquoi? Considérez les fragments comme de petits éléments d'interface utilisateur que vous pouvez utiliser dynamiquement à l'intérieur d'une activité. Nous arrivons ici à la première chose importante: assurez-vous que l'activité qui contient votre fragment n'est pas simplement une activité, mais un FragmentActivity . Maintenant, vous pouvez faire deux choses:

  1. getFragmentManager () : renvoyer le FragmentManager pour interagir avec des fragments associés à l'activité de ce fragment. Notez que ce sera non nul légèrement avant getActivity (), pendant la période entre le moment où le fragment est placé dans un FragmentTransaction et celui où il est validé et attaché à son activité. Ce n'est pas une option pour vous car, évidemment, votre fragment n'est encore utilisé par aucune activité.
  2. Utilisez le contexte que vous avez transmis à votre fragment. Il contient des informations sur l'activité actuellement active. N'oubliez pas que votre fragment n'y est toujours pas attaché. Donc ce que vous faites est: context.getActivity (). getSupportFragmentManager ()

Cela devrait résoudre vos problèmes. Gardez toujours à l'esprit les différents états d'un fragment et comment ils affectent son comportement . Votre fragment, par exemple, ne se joint même pas encore.


3 commentaires

context.getActivity (). getSupportManager () ne fonctionne pas


getSupportManager est en rouge


getSupportManager () n'est pas ce que j'ai écrit.



0
votes

Vous instanciez le fragment mais vous ne l'ajoutez pas à l'interface utilisateur. Étant donné que le fragment n'est pas attaché à l'activité lorsque vous appelez la méthode addFood, getActivity () renvoie null.

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState){
    super.onViewCreated(view, savedInstanceState);
    addFood(); }

Après avoir instancié, vous devez appeler la méthode show pour ajouter l'instance de fragment à l'interface utilisateur

postFood f = postFood.newInstance(context, breakfastDate, breakfastSearch, 1);
f.show(getSupportFragmentManager(), "MyTAG");

et appelez la méthode addFood dans la méthode onViewCreated à partir de votre fragment

postFood f = new postFood();
f.addFood(context, breakfastDate, breakfastSearch, 1);


0 commentaires