我在应用程序上使用了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();
}
}
[让我知道是否需要更多代码]
我该如何解决?
答案 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
答案 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
页,无空白,
有关Fragment
生命周期的更多说明,请参考this