[英]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.