Распишем логику работы фрагмента добавления нового контакта. Мы пока не касаемся момента передачи данных, введенных пользователем. В третьей лабораторной работе мы использовали метод setResult() как часть работы метода startActivityForResult(). В нашем случае, мы открываем не новое activity, а фрагмент, поэтому стратегия передачи данных будет другая.
Большую часть кода мы можем перенести из окна AddContactActivity. Сначала создадим поля
Добавим метод onActivityResult(). Обратите внимание, что в фрагменте тоже есть метод onActivityResult(), который вызывается после метода onActivityResult() в Activity, к которой прикреплен метод.
AddContactFragment.java
publicclassAddContactFragmentextendsFragment {privateImageView mContactImage;privatestaticfinalint IMAGE_CAPTURE_REQUEST_CODE =7777; @OverridepublicvoidonActivityResult(int requestCode,int resultCode, @NullableIntent data) { super.onActivityResult(requestCode, resultCode, data);if (requestCode == IMAGE_CAPTURE_REQUEST_CODE && resultCode ==Activity.RESULT_OK&& data !=null) {Bundle extras =data.getExtras();Bitmap imageBitmap = (Bitmap) extras.get("data");// Меняем ImageView с изображением контактаmContactImage.setImageBitmap(imageBitmap);String filename ="contact_"+System.currentTimeMillis() +".png"; File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), filename);
FileOutputStream fileOutputStream =null;try { fileOutputStream =newFileOutputStream(outputFile);imageBitmap.compress(Bitmap.CompressFormat.PNG,100, fileOutputStream);// Сохраняем путь к файлу в формате UriviewModel.setContactImageUri(Uri.fromFile(outputFile));fileOutputStream.flush();fileOutputStream.close(); } catch (IOException e) {e.printStackTrace(); } } }}
Далее реализуем обработчики нажатий на кнопки в методе onViewCreated(). Обратите внимание, что для закрытия фрагмента мы вызываем метод onBackPressed() у родительского activity. Сам метод onBackPressed() в MainActivity мы переопределим позже.
AddContactFragment.java
publicclassAddContactFragmentextendsFragment {... @OverridepublicvoidonViewCreated(@NonNullView view, @NullableBundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mContactImage =view.findViewById(R.id.profile_image);EditText nameEditText =view.findViewById(R.id.name_et);EditText EmailEditText =view.findViewById(R.id.email_et);EditText PhoneEditText =view.findViewById(R.id.phone_et);Button addContactButton =view.findViewById(R.id.button_add);addContactButton.setOnClickListener(v -> {if (uri ==null) {Toast.makeText(requireContext(),"Contact image not set!",Toast.LENGTH_SHORT).show();return; }String name =nameEditText.getText().toString();String email =EmailEditText.getText().toString();String phone =PhoneEditText.getText().toString();// TODO: передать данные в список контактовgetActivity().onBackPressed(); });Button takePhotoButton =view.findViewById(R.id.button_camera);takePhotoButton.setOnClickListener(v -> {Intent takePictureIntent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);try {startActivityForResult(takePictureIntent, IMAGE_CAPTURE_REQUEST_CODE); } catch (ActivityNotFoundException e) {Toast.makeText(requireContext(),"Error while trying to open camera app",Toast.LENGTH_SHORT).show(); } });Button cancelButton =view.findViewById(R.id.button_cancel);cancelButton.setOnClickListener(v ->getActivity().onBackPressed()); }}
На данный момент, полный код класса AddContactFragment выглядит следующим образом.
AddContactFragment.java
publicclassAddContactFragmentextendsFragment {privateUri uri;privateImageView mContactImage;privatestaticfinalint IMAGE_CAPTURE_REQUEST_CODE =7777;publicAddContactFragment() {// Required empty public constructor } @OverridepublicViewonCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {returninflater.inflate(R.layout.fragment_add_contact, container,false); } @OverridepublicvoidonActivityResult(int requestCode,int resultCode, @NullableIntent data) { super.onActivityResult(requestCode, resultCode, data);if (requestCode == IMAGE_CAPTURE_REQUEST_CODE && resultCode ==Activity.RESULT_OK&& data !=null) {Bundle extras =data.getExtras();Bitmap imageBitmap = (Bitmap) extras.get("data");// Меняем ImageView с изображением контактаmContactImage.setImageBitmap(imageBitmap);String filename ="contact_"+System.currentTimeMillis() +".png"; File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), filename);
FileOutputStream fileOutputStream =null;try { fileOutputStream =newFileOutputStream(outputFile);imageBitmap.compress(Bitmap.CompressFormat.PNG,100, fileOutputStream);// Сохраняем путь к файлу в формате Uri uri =Uri.fromFile(outputFile);fileOutputStream.flush();fileOutputStream.close(); } catch (IOException e) {e.printStackTrace(); } } } @OverridepublicvoidonViewCreated(@NonNullView view, @NullableBundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); viewModel =newViewModelProvider(requireActivity()).get(DataViewModel.class); mContactImage =view.findViewById(R.id.profile_image);EditText nameEditText =view.findViewById(R.id.name_et);EditText EmailEditText =view.findViewById(R.id.email_et);EditText PhoneEditText =view.findViewById(R.id.phone_et);Button addContactButton =view.findViewById(R.id.button_add);addContactButton.setOnClickListener(v -> {if (uri ==null) {Toast.makeText(requireContext(),"Contact image not set!",Toast.LENGTH_SHORT).show();return; }String name =nameEditText.getText().toString();String email =EmailEditText.getText().toString();String phone =PhoneEditText.getText().toString();// TODO: передать данные в список контактовgetActivity().onBackPressed(); });Button takePhotoButton =view.findViewById(R.id.button_camera);takePhotoButton.setOnClickListener(v -> {Intent takePictureIntent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);try {startActivityForResult(takePictureIntent, IMAGE_CAPTURE_REQUEST_CODE); } catch (ActivityNotFoundException e) {Toast.makeText(requireContext(),"Error while trying to open camera app",Toast.LENGTH_SHORT).show(); } });Button cancelButton =view.findViewById(R.id.button_cancel);cancelButton.setOnClickListener(v ->getActivity().onBackPressed()); }}