В строках
MedDetailFragment medDetailFragment = new MedDetailFragment();
medDetailFragment.setArguments(bundle);
Вы создали экземпляр MedDetailFragment
фрагмента и добавили свои аргументы.На данный момент все предпосылки выполнены, и medDetailFragment
готов к использованию.Теперь пришло время добавить его к заполнителю, скажем fragment_container
.Но в строке
fragmentTransaction.replace(R.id.fragment_container, new `MedDetailFragment`())
вы снова создали новый экземпляр фрагмента с помощью оператора new
, используя конструктор по умолчанию, который создает чистый экземпляр фрагмента MedDetailFragment
без дополнительных данных (bundle
объект).Очевидно, что вызов getArguments()
для этого экземпляра фрагмента пытается вызвать несуществующую часть фрагмента, в результате чего получается java.lang.NullPointerException
.
Решение:
В MedListFragment
классе вы должны добавить дополнительный оператор new MedDetailFragment()
в строке
fragmentTransaction.replace(R.id.fragment_container, new MedDetailFragment());
с medDetailFragment
, который вы создали ранее.
Оптимизация:
Настоятельно рекомендуется использовать фабричный метод в случае работы с Fragments
.Для этого класс MedDetailFragment
должен выглядеть следующим образом:
public class MedDetailFragment extends Fragment {
public MedDetailFragment() {
// Required empty public constructor
}
public static MedDetailFragment newInstance(Medicine med) {
Bundle bundle = new Bundle();
bundle.putParcelable("medicine", med);
MedDetailFragment medDetailFragment = new MedDetailFragment();
medDetailFragment.setArguments(bundle);
return medDetailFragment;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_med_detail, container, false);
Bundle bundle = getArguments();
Medicine medicine = bundle.getParcelable("medicine");
return root;
}
}
, а в классе MedListFragment
вы должны просто заменить две строки
MedDetailFragment medDetailFragment = new MedDetailFragment();
medDetailFragment.setArguments(bundle);
только одной строкой кода:
MedDetailFragment medDetailFragment = MedDetailFragment.newInstance(med);
Этот подход заключает в себе механизм внутри класса MedDetailFragment
, его гораздо проще и легче отлаживать.
Надеюсь, это поможет.