java.lang.NullPointerException at java.util.Objects.requireNonNull - PullRequest
0 голосов
/ 15 января 2019

В моем коде я вызываю функцию addFood, как следует из действия

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

и затем код запускает следующий код

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

Что я могу сделать для того, чтобы getActivity (). GetSuppotFragmentManaget не был нулевым?

вот мой ЛОГ

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)

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Хорошо, позвольте мне объяснить это очень быстро. То, что Вайбхав Кумар упомянул в своем комментарии, правильно, но я думаю, что вы еще не до конца поняли. Идея состоит в том, чтобы передать контекст из вызывающей операции во фрагмент. Зачем? Думайте о Фрагментах как о небольших элементах пользовательского интерфейса, которые вы можете динамически использовать внутри Действия. Здесь мы подходим к первому важному: убедитесь, что действие, содержащее ваш фрагмент, является не просто действием, а FragmentActivity . Теперь вы можете сделать две вещи:

  1. getFragmentManager () : Возвращает FragmentManager для взаимодействия с фрагментами, связанными с активностью этого фрагмента. Обратите внимание, что это будет ненулевое значение перед getActivity (), в течение времени с момента, когда фрагмент помещается в FragmentTransaction, пока он не будет зафиксирован и присоединен к своей активности. Это не вариант для вас, потому что, очевидно, ваш фрагмент еще не используется какими-либо действиями.
  2. Используйте контекст, который вы передали своему фрагменту. Содержит информацию о текущей активной деятельности. Помните, что ваш фрагмент все еще не прикреплен к нему. Итак, что вы делаете: context.getActivity(). getSupportFragmentManager ()

Это должно решить ваши проблемы. Всегда помните о различных состояниях фрагмента и о том, как они влияют на его поведение. Например, ваш фрагмент еще не прикреплен.

0 голосов
/ 15 января 2019

Вы создаете экземпляр фрагмента, но не добавляете его в пользовательский интерфейс. Поскольку фрагмент не присоединяется к действию при вызове метода addFood, getActivity () возвращает ноль.

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

После создания экземпляра вы должны вызвать метод show, чтобы добавить экземпляр фрагмента в пользовательский интерфейс

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

и вызовите метод addFood внутри метода onViewCreated из вашего фрагмента

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState){
    super.onViewCreated(view, savedInstanceState);
    addFood(); }
0 голосов
/ 15 января 2019

Трудно сказать, почему getActivity() является нулевым, поскольку мы не знаем, где вы вызываете свой метод.

Вы должны знать, что getActivity() равно нулю до onAttach() и после onDestroy(), если вы вызываете свой метод между этими двумя методами, вы должны быть хорошими.

Что я могу сделать, чтобы предотвратить использование getActivity (). GetSuppotFragmentManaget равным нулю?

Жестоко отвечая на ваш вопрос. Когда вы используете getActivity() в своем коде, хорошей практикой является его приведение, чтобы убедиться, что оно не равно нулю (если вы не уверены, что оно не равно нулю). В вашем коде это будет так.

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

Используя их, вы не будете иметь проблемы getActivity.getSupportFragmentManager(), будучи нулевым. BUTT , это потому, что эта часть вашего кода больше не будет работать. Он увидит, что getActivity() равен нулю, и не будет следовать коду.

С этого момента ваше приложение больше не будет зависать, однако вы не увидите диалоговое окно. Теперь вам нужно предотвратить сброс значения getActivity() на ноль. Для этого я рекомендую вам.

  1. Проверьте, где вы вызываете свой метод;
  2. Попробуйте вызвать ваш метод из разных мест;
  3. Убедитесь, что ваша деятельность / фрагмент находится внутри onAttach() и onDestroy() метода, когда вы используете getActivity().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...