1.2 Настройка AddContactFragment

Распишем логику работы фрагмента добавления нового контакта. Мы пока не касаемся момента передачи данных, введенных пользователем. В третьей лабораторной работе мы использовали метод setResult() как часть работы метода startActivityForResult(). В нашем случае, мы открываем не новое activity, а фрагмент, поэтому стратегия передачи данных будет другая.

Большую часть кода мы можем перенести из окна AddContactActivity. Сначала создадим поля

AddContactFragment.java
public class AddContactFragment extends Fragment {

    private ImageView mContactImage;
    private static final int IMAGE_CAPTURE_REQUEST_CODE = 7777;

}

Добавим метод onActivityResult(). Обратите внимание, что в фрагменте тоже есть метод onActivityResult(), который вызывается после метода onActivityResult() в Activity, к которой прикреплен метод.

AddContactFragment.java
public class AddContactFragment extends Fragment {

    private ImageView mContactImage;
    private static final int IMAGE_CAPTURE_REQUEST_CODE = 7777;

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent 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 = new FileOutputStream(outputFile);
                imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);

                // Сохраняем путь к файлу в формате Uri

                viewModel.setContactImageUri(Uri.fromFile(outputFile));

                fileOutputStream.flush();
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Далее реализуем обработчики нажатий на кнопки в методе onViewCreated(). Обратите внимание, что для закрытия фрагмента мы вызываем метод onBackPressed() у родительского activity. Сам метод onBackPressed() в MainActivity мы переопределим позже.

AddContactFragment.java
public class AddContactFragment extends Fragment {

    ...

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle 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 = new Intent(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
public class AddContactFragment extends Fragment {

    private Uri uri;
    private ImageView mContactImage;
    private static final int IMAGE_CAPTURE_REQUEST_CODE = 7777;

    public AddContactFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_add_contact, container, false);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent 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 = new FileOutputStream(outputFile);
                imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);

                // Сохраняем путь к файлу в формате Uri

                uri = Uri.fromFile(outputFile);

                fileOutputStream.flush();
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

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

        viewModel = new ViewModelProvider(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 = new Intent(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());
    }
}

Last updated