Переменная интерфейса возвращает ноль, даже если метод "OnAttach" - PullRequest
0 голосов
/ 05 июля 2019

Я просто пытаюсь обновлять свой RecyclerView каждый раз, когда мой AudioRecorder создает новый файл. Мое повторное представление создается на фрагменте (назовем его фрагментом А). У меня есть еще один фрагмент, где каждый раз, когда он вызывается, начинается запись звука (назовем его фрагмент B).

Я использую интерфейс во фрагменте B, чтобы сообщить фрагменту A, что адаптер должен обновлять данные.

Я создал открытый интерфейс с методом «UpdateData ()».

Когда кнопка «Остановить запись» нажата на фрагменте B, я вызываю интерфейс, чтобы он мог связаться с основным фрагментом (фрагмент A) и обновить данные.

Пока что Android Studio сообщает, что моя переменная из интерфейса равна нулю, хотя я определил ее в методе «При подключении».

[Переменная контекста в методе «При подключении» относится к моей основной деятельности, а не к моему текущему фрагменту, в котором находится обзор реселлера. Это проблема, поэтому я изменил ее, чтобы он получил фрагменты. Но это не остановило приложение от сбоя].

//Here's my main Fragment (Fragment A)
public class RecordsFragment extends Fragment implements Records_BottomSheet_Dialog.BottomSheet_Interface {
    private static final int PERMISSION_REQUEST = 1000;
    static ArrayList<String> mNames = new ArrayList<>();
    static ArrayList<String> NbFiles = new ArrayList<>();
    static ArrayList<String> PathFiles = new ArrayList<>();
    static int NumberFile= 0;
    static RecyclerView recyclerView;
    static RecyclerViewAdapter adapter;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_records, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //Check if we have the permission to read storage
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //We don't have the permission, so request it.
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST);
        }
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.RECORD_AUDIO)
                != PackageManager.PERMISSION_GRANTED) {
            //We don't have the permission, so request it.
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSION_REQUEST);
        }
        //We already have permission
        else {
            permissionExists();
        }
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        initRecyclerView(view, recyclerView, adapter);
            }

    @Override
    public void onResume() {
        super.onResume();
        ((FileAndDirectoryActivity) getActivity())
                .setButton("Créer un nouvel Enregistrement", true);
    }
    public void initRecyclerView(View v, RecyclerView recyclerView, RecyclerView.Adapter adapter) {
        recyclerView = v.findViewById(R.id.recyclerview);
        adapter = new RecyclerViewAdapter(mNames, getActivity().getApplicationContext());
        adapter.notifyDataSetChanged();
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
    }
    private void permissionExists() {
        mNames.clear();
        PathFiles.clear();
        NbFiles.clear();
        String path = Environment.getExternalStorageDirectory().toString() + "/Rapture";
        File directory = new File(path);
        boolean success = true;
        if (!directory.exists()) {
            success = directory.mkdirs();
        }
        if (success) {
            File[] arrayFiles = directory.listFiles();
            for (File file : arrayFiles) {
                mNames.add(file.getName());
                PathFiles.add(file.getPath());
                NbFiles.add(file.getName());
            }
        }
    }

    @Override
    public void UpdatetheData(boolean state) {
        if (state==true){
            adapter.notifyDataSetChanged();
        }

    }
}
//Here's my other fragment (the one that records upon called, Fragment B)
public class Records_BottomSheet_Dialog extends BottomSheetDialogFragment{
    private MediaRecorder AudioRecorder;
    private String outputFile;
    private FloatingActionButton stop;
    private static final int PERMISSION_REQUEST = 1000;
    private Integer FileSize = RecordsFragment.NbFiles.size();
    private BottomSheet_Interface bts;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        permissionExists();
        View view = inflater.inflate(R.layout.modal_records, container, false);
        FloatingActionButton stop_record = view.findViewById(R.id.stop);
        stop_record.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bts.UpdatetheData(true);
                AudioRecorder.stop();
                AudioRecorder.release();
                AudioRecorder = null;
                Toast.makeText(getActivity(), "Fin de l'enregistrement", Toast.LENGTH_SHORT).show();
                dismiss();
            }
        });
        return view;
    }
    public interface BottomSheet_Interface{
        void UpdatetheData(boolean state);
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            bts = (BottomSheet_Interface) getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
        } catch (ClassCastException e){
            throw new ClassCastException(context.toString()
            +" must implement BottomSheet_Interface");
        }

    }

    private void permissionExists() {
        AudioRecorder = new MediaRecorder();
        AudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        AudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        if (FileSize != 0) {
            for (int i = 0; i < FileSize + 1; i++) {
                String path = Environment.getExternalStorageDirectory().toString() + "/Rapture/Recording(" + Integer.toString(i) + ").mp3";
                File f = new File(path);
                if (!f.exists()) {
                    AudioRecorder.setOutputFile(Environment.getExternalStorageDirectory().toString() + "/Rapture/Recording(" + Integer.toString(i) + ").mp3");
                    break;
                }
            }
        } else {
            AudioRecorder.setOutputFile(Environment.getExternalStorageDirectory().toString() + "/Rapture/Recording(0).mp3");
        }
        AudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        Toast.makeText(getActivity(), "Enregistrement", Toast.LENGTH_SHORT).show();
        try {
            AudioRecorder.prepare();
            AudioRecorder.start();
        } catch (IllegalStateException ie) {

        } catch (IOException ioe) {

        }
    }

}

Проблема в том, что когда я записываю несколько дублей с помощью AudioRecorder, если RecyclerView не был обновлен, то приложение вылетает, если я пытаюсь повторить попытку. Поэтому мне нужно обновлять адаптер RecyclerView каждый раз, когда пользователь прекращает запись.

Я ожидаю, что RecyclerView напрямую покажет созданный новый файл, но вместо этого мне придется перейти на другие вкладки, прежде чем вернуться на вкладку аудио, чтобы обновить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...