Android 在应用程序暂停后询问 findViewById 时返回 NullPointerException

Android returning NullPointerException when asking findViewById after app is paused

每当我使用应用程序切换器或应用程序以任何其他方式暂停然后在恢复它时,我将在我的片段中尝试使用 findViewById 时得到 NullPointerException。当尝试使用 getActivity() 或与 Main activity 相关的任何内容时,也会发生同样的情况。我已经尝试使用 isAdded() 检查片段是否已附加,并且它 returns 是正确的,但仍然给出错误。 (不要介意代码的样子,我仍然需要清理它)

不包括所有不相关的 class 内容和方法(例如亵渎 class)。

MainActivity onStart 方法(启动activity)

@Override
public void onStart() {
    super.onStart();
    Profanity.downloadList();
    if (AskForPermissions()) {
        if (mAuth.getCurrentUser() != null) {
            mAuth.getCurrentUser().reload().addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.MainFragment, new LoginFragment()).commit();
                }
            }).addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.MainFragment, new HomeFragment()).commit();
                }
            });
        } else {
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.MainFragment, new LoginFragment()).commit();
        }
    } else {
        onStart();
    }
}

HomeFragment(崩溃的那个,崩溃发生在第4行的Started()下)

@SuppressWarnings("all")
@Override
public void onStart() {
    super.onStart();

    loadVariables();

    final String UUID = ((MainActivity) getActivity()).mAuth.getCurrentUser().getUid();
    User.UUID = UUID;
    if (User.userName == null || User.userName.equals("")) {
        Functions.loadUserData(UUID).addOnCompleteListener(new OnCompleteListener() {
            @Override
            public void onComplete(@NonNull Task task) {

                if (task.getResult() == null) {
                    final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                    builder.setTitle("Choose your username");

                    final EditText input = new EditText(getActivity());
                    input.setInputType(InputType.TYPE_CLASS_TEXT);
                    builder.setView(input);

                    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    });

                    final AlertDialog dialog = builder.create();
                    dialog.show();

                    dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (input.getText() != null && !input.getText().toString().equals("") && !input.getText().toString().equals(" ")) {
                                if (input.getText().toString().toCharArray().length > 16) {
                                    dialog.dismiss();
                                    Functions.showBottomMessage(getView(), "Your username must be maximum 16 characters.");
                                    dialog.show();
                                } else if (Profanity.contains(input.getText().toString())) {
                                    dialog.dismiss();
                                    Functions.showBottomMessage(getView(), "Please refrain from using restricted words in your username.");
                                    input.setText("");
                                    dialog.show();
                                } else {
                                    User.userName = input.getText().toString();
                                    dialog.dismiss();
                                    FirebaseReferences.users.child(User.UUID).child("name").setValue(User.userName);
                                    Functions.showBottomMessage(getView(), "Username saved.");
                                }
                            } else {
                                dialog.dismiss();
                                Functions.showBottomMessage(getView(), "Please enter a valid username.");
                                dialog.show();
                            }
                        }
                    });

                    Started();
                } else {

                    HashMap temp = (HashMap) task.getResult();

                    if (temp.containsKey("name")) {
                        User.userName = temp.get("name").toString();
                    } else {
                        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                        builder.setTitle("Choose your username");

                        final EditText input = new EditText(getActivity());
                        input.setInputType(InputType.TYPE_CLASS_TEXT);
                        builder.setView(input);

                        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                            }
                        });

                        final AlertDialog dialog = builder.create();
                        dialog.show();

                        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (input.getText() != null && !input.getText().toString().equals("") && !input.getText().toString().equals(" ")) {
                                    User.userName = input.getText().toString();
                                    dialog.dismiss();
                                    FirebaseReferences.users.child(UUID).child("name").setValue(input.getText().toString());
                                } else {
                                    dialog.dismiss();
                                    dialog.show();
                                }
                            }
                        });
                    }
                    if (temp.containsKey("place")) {
                        User.place = temp.get("place").toString();
                    }
                    if (temp.containsKey("ratedImages")) {
                        User.ratedImages = (ArrayList<String>) temp.get("ratedImages");
                    }
                    if (temp.containsKey("developer")) {
                        if (Boolean.valueOf(temp.get("developer").toString().toLowerCase()))
                            User.isDeveloper = true;
                    }

                    Started();
                }
            }
        });
    } else {
        Started();
    }
}

@SuppressWarnings("all")
private void Started() {
    mainImageProgressBar.setVisibility(View.VISIBLE);
    secondaryImageProgressBar.setVisibility(View.VISIBLE);
    CacheHandler.update(getActivity(), imageView, secondImageView, true);
    /*THIS IS THE FIRST CRASH POINT - */getView().findViewById(R.id.fabSendImage).setOnClickListener(getBtnSendImageOnClickListener());
    getView().findViewById(R.id.btnReportImage).setOnClickListener(btnReportImageOnClick);
}

由于 getView() 而崩溃。因为它无法获得视图。

您需要传递包含 ID R.id.fabSendImage 视图的 view 并尝试调用 view.findViewById(R.id.fabSendImage) 进行初始化。

所有与视图相关的代码都必须移至 onCreateView()。因此,如果是片段,只需将代码放在 onCreateView 上,如果是 activity.

,则将代码放在 onCreate 上

有关更多信息,请浏览 https://developer.android.com/guide/components/fragments.html