代码之家  ›  专栏  ›  技术社区  ›  Devvix

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

  •  0
  • Devvix  · 技术社区  · 7 年前

    每当我使用应用程序切换器或应用程序以任何其他方式暂停时,在恢复时,我会收到一个 NullPointerException 尝试使用时 findViewById 在我的片段中。当尝试使用getActivity()或与主活动相关的任何内容时,也会发生同样的情况。我试着检查碎片是否与 isAdded() 它返回true,但仍然给出错误。(不要介意代码的外观,我仍然需要清理它)

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

    MainActivity onStart方法(启动活动)

    @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);
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Suraj Nair    7 年前

    所有与视图相关的代码都必须移到onCreateView()。因此,如果是片段,只需将代码放在onCreateView中,如果是活动,只需将代码放在onCreate中。

    欲了解更多信息,请点击 https://developer.android.com/guide/components/fragments.html

        2
  •  0
  •   Durga M    7 年前

    由于以下原因而崩溃 getView()

    你需要通过 view 其中包含id视图 R.id.fabSendImage 试着打电话给 view.findViewById(R.id.fabSendImage) 初始化。