Метод инициализации для 'RecyclerView' сбивает приложение при использовании с фрагментами - PullRequest
1 голос
/ 02 июля 2019

Я использовал в своем приложении recyclerView для отображения всех файлов из внешнего хранилища.Пока я не изменил его, он работал нормально, когда он был реализован в "MainActivity.java".

Теперь я хочу, чтобы мое приложение имело "BottomNavigationBar";для этого я использую фрагменты.Проблема в том, что приложение вылетает, когда я касаюсь определенного пункта в меню (тот, который содержит RecyclerView).

Я изменил весь метод "this" на ".getActivity ()", но он все равно потерпел крах.Я изменил его на «.getActivity (). GetApplicationContext ()», но он все равно потерпел крах.

Извините, мой компьютер не поддерживает аппаратное ускорение, поэтому я не могу правильно показать, в чем заключается ошибка.Вместо этого я подключил отладчик к своему подключенному телефону и установил точки останова.При сбое приложения отладчик выделил строку "RecyclerView recyclerView = getView().findViewById(R.id.recyclerview);".

Вот фрагмент кода:

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

    private static final int PERMISSION_REQUEST = 1000;
    private ArrayList<String> mNames = new ArrayList<>();
    public static ArrayList<String> NbFiles = new ArrayList<>();
    public ArrayList<String> PathFiles = new ArrayList<>();

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(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);
        }
        //We already have permission
        else {
            permissionExists();
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PERMISSION_REQUEST) {
            if (resultCode == RESULT_OK) {
                permissionExists();
            } else {
                //handle error
            }
        }
    }

    private void initRecyclerView() {
        RecyclerView recyclerView = getView().findViewById(R.id.recyclerview);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(mNames, getActivity().getApplicationContext(), (RecyclerViewAdapter.OnNoteListener) this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
    }

    private void permissionExists() {
        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());
            }
        }
        initRecyclerView();
    }
}

[Дайте мне знать, если вам нужно больше кода]

Как я могу это исправить?

Ответы [ 6 ]

0 голосов
/ 02 июля 2019

Измените свой код на это-

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_records, container, false);
    initRecyclerView(view);
    return view;
}



private void initRecyclerView(View view) {
        RecyclerView recyclerView = view.findViewById(R.id.recyclerview);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(mNames, getActivity().getApplicationContext(), (RecyclerViewAdapter.OnNoteListener) this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
    }
0 голосов
/ 02 июля 2019

Переместите ниже код для разрешения на обработку onActivityCreated

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        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);
        }
        //We already have permission
        else {
            permissionExists();
        }
    }

Во Fragment вы можете инициализировать ваше представление в onViewCreated

    // This event is triggered soon after onCreateView().
    // Any view setup should occur here.  E.g., view lookups and attaching view listeners.
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        // Setup any handles to view objects here
         initRecyclerView(view);
    }

Измените initRecyclerView(), как показано ниже,

private void initRecyclerView(View v) {
        RecyclerView recyclerView = v.findViewById(R.id.recyclerview);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(mNames, getActivity().getApplicationContext(), (RecyclerViewAdapter.OnNoteListener) this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
    }

Появится fragment страница без пробела,

Screenshot1

Для получения дополнительных разъяснений о жизненном цикле Fragmentсм. это

0 голосов
/ 02 июля 2019

Здесь проблема заключается в том, что ваши recyclerView инициализируются путем вызова getActivity(), но проблема в том, что действие не существует до тех пор, пока не будет вызван onActivityCreated().

Таким образом, происходит сбой.Переместите весь этот код внутри onCreate() в onActivityCreated(), и он должен работать нормально.

0 голосов
/ 02 июля 2019

попробуйте этот getActivity() экземпляр getView()

RecyclerView recyclerView = getView().findViewById(R.id.recyclerview);  

экземпляр

RecyclerView recyclerView = getActivity().findViewById(R.id.recyclerview);
0 голосов
/ 02 июля 2019
RecyclerView recyclerView = getView().findViewById(R.id.recyclerview);

Вместо getView() вам нужно использовать вид, накачанный в onCreateView

Итак,

 RecyclerView recyclerView;

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_records, container, false);
        recyclerView = v.findViewById(R.id.recyclerview);
        return v;
    }

Если вы хотите, вы можете заполнить RecyclerView (или сделать его видимым, или как угодно) в initRecyclerView()

0 голосов
/ 02 июля 2019

Удалите метод onCreate и переместите логику в onCreateView

...