簡體   English   中英

當應用暫停后,Android詢問findViewById時,Android返回NullPointerException

[英]Android returning NullPointerException when asking findViewById after app is paused

每當我使用應用程序切換器或應用程序以任何其他方式暫停時,恢復該應用程序時,當我嘗試在片段中使用findViewById時,都會收到NullPointerException 嘗試使用getActivity()或與Main活動相關的任何東西時,也會發生相同的情況。 我試過使用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(發生崩潰的崩潰,崩潰發生在第四行的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);
}

所有與視圖相關的代碼都必須移至onCreateView()。 因此,只需將代碼放置在onCreateView(如果有片段的情況下)和onCreate(如果有活動的話)。

有關更多信息,請訪問https://developer.android.com/guide/components/fragments.html

由於getView()崩潰。 因為它無法獲取視圖。

你需要通過view持有編號為的觀點R.id.fabSendImage並嘗試調用view.findViewById(R.id.fabSendImage)來初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM