与片段一起使用时,“ RecyclerView”的初始化方法会使应用程序崩溃

时间:2019-07-02 11:47:09

标签: android android-fragments android-recyclerview android-bottom-nav-view

我在应用程序上使用了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 :(得分:0)

@style

您需要使用<xsl:template match="td"> <fo:table-cell> <xsl:if test="@style"> <xsl:attribute name="background-color"> <xsl:value-of select="substring-after(@style, 'background-color: ')" /> </xsl:attribute> </xsl:if> ... 中夸大的视图,而不是RecyclerView recyclerView = getView().findViewById(R.id.recyclerview);

所以

getView()

如果需要,您可以在onCreateView

中填充RecyclerView(或使其可见)。

答案 1 :(得分:0)

尝试一下 getActivity()的{​​{1}}实例

getView()

实例

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

答案 2 :(得分:0)

将代码更改为此-

@Override
public Response getFileFromStorage(String fileId) {
    Response fileStorageResponse = fileStorageApi.getFileById(fileId);

    // NOW I USE THIS WAY FOR CHECKING RESPONSE BUT IT DOESN'T LOOK GOOD
    //if (fileStorageResponse.status() != HttpStatus.OK.value()) {
    //    throw new OsagoServiceException();
    //}
    return fileStorageResponse;
}

答案 3 :(得分:-1)

删除onCreate方法并将逻辑移至onCreateView

答案 4 :(得分:-1)

这是您的recyclerView通过调用getActivity()进行初始化的问题,但问题是该活动直到调用onActivityCreated()才存在。

所以它崩溃了。将onCreate()中的所有代码移至onActivityCreated(),它应该可以正常工作。

答案 5 :(得分:-1)

移动下面的代码来处理权限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生命周期的更多说明,请参考this