Моя полоса прогресса вызывает сбой моей активности - PullRequest
2 голосов
/ 04 августа 2020

У меня есть настраиваемый макет индикатора выполнения. Я включаю этот макет в действия и использую его всякий раз, когда что-то обновляется или загружается. Однако в режиме отладки он устанавливает индикатор выполнения на нуль и уничтожает все объекты (адрес электронной почты, имя пользователя, пароль, профиль pi c) и не может сохранить его в Firebase.

Вот моя активность при регистрации code:

private TextInputEditText etEmail, etName;
private String email, name;

private ImageView ivProfile;
private FirebaseUser firebaseUser;
private DatabaseReference databaseReference;

private StorageReference fileStorage;
private Uri localFileUri, serverFileUri;
private FirebaseAuth firebaseAuth;
private View progressBar;

// Text is changed for confirm dialog
private Boolean textChanged = false;

@SuppressLint("SourceLockedOrientationActivity")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);

    etEmail = findViewById(R.id.etEmail);
    etName = findViewById(R.id.etName);
    ivProfile = findViewById(R.id.ivProfile);

    fileStorage = FirebaseStorage.getInstance().getReference();

    firebaseAuth = FirebaseAuth.getInstance();
    firebaseUser = firebaseAuth.getCurrentUser();

    progressBar = findViewById(R.id.progressBar);

    setTitle("Profile");
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    if (firebaseUser!=null)
    {
        etName.setText(firebaseUser.getDisplayName());
        etEmail.setText(firebaseUser.getEmail());
        serverFileUri = firebaseUser.getPhotoUrl();

        if (serverFileUri!=null)
        {
            Glide.with(this)
                    .load(serverFileUri)
                    .placeholder(R.drawable.default_profile)
                    .error(R.drawable.default_profile)
                    .into(ivProfile);
        }
    }

    etName.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            textChanged = true;
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });




}

// Logout button
public void btnLogoutClick(View view)
{

    FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
    firebaseAuth.signOut();
    startActivity(new Intent(ProfileActivity.this, LoginActivity.class));
    finish();
}


// Save changes button
public void btnSaveClick(View view)
{
    if (textChanged)
    {
        new AlertDialog.Builder(ProfileActivity.this)
                .setTitle("Save changes")
                .setMessage("Please confirm that you want to apply these changes to your profile.")
                .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        if (etName.getText().toString().trim().equals(""))
                        {
                            etName.setError(getString(R.string.enter_name));
                        } else {
                            if (localFileUri!=null){
                                updateNameAndPhoto();
                            } else {
                                updateOnlyName();
                            }
                        }
                    }
                })
                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog, int which){
                        finish();
                    }
                })

                .setIcon(R.drawable.ic_save_primarycolor)
                .show();
    }
    else
    {
        Toast.makeText(this, R.string.nothing_to_save, Toast.LENGTH_SHORT).show();
        finish();
    }

}


// Changing profile image
public void changeImage(View view)
{

    if (serverFileUri==null)
    {
        pickImage();
    }
    else
    {
        PopupMenu popupMenu = new PopupMenu(this, view);
        popupMenu.getMenuInflater().inflate(R.menu.menu_picture, popupMenu.getMenu());
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                int id = menuItem.getItemId();

                if (id==R.id.mnuChangePic)
                {
                    pickImage();
                }
                else if (id==R.id.mnuRemovePic)
                {
                    removePhoto();
                }

                return false;
            }
        });
        popupMenu.show();
    }

}


// Method to change image
private void pickImage()
{



    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED) {
        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, 101);
    }
    else
    {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 102);
    }
}


@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 101) {
        if (resultCode == RESULT_OK) {

            textChanged = true;
            localFileUri = data.getData();
            ivProfile.setImageURI(localFileUri);
        }

    }
}


@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode==102)
    {
        if (grantResults[0]==PackageManager.PERMISSION_GRANTED)
        {
            Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(intent, 101);
        }
        else
        {
            Toast.makeText(this, R.string.permission_required, Toast.LENGTH_SHORT).show();
        }

    }
}


// Method to remove image
private void removePhoto()
{

    textChanged = true;

    progressBar.setVisibility(View.VISIBLE);
    UserProfileChangeRequest request = new UserProfileChangeRequest.Builder()
            .setDisplayName(etName.getText().toString().trim())
            .setPhotoUri(null)
            .build();

    firebaseUser.updateProfile(request).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            progressBar.setVisibility(View.GONE);
            if (task.isSuccessful()) {
                String userID = firebaseUser.getUid();
                databaseReference = FirebaseDatabase.getInstance().getReference().child(NodeNames.USERS);

                HashMap<String, String> hashMap = new HashMap<>();
                hashMap.put(NodeNames.PHOTO, "");

                databaseReference.child(userID).setValue(hashMap)
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {

                                Toast.makeText(ProfileActivity.this, R.string.photo_removed_successfully, Toast.LENGTH_SHORT).show();
                            }
                        });


            } else {
                Toast.makeText(ProfileActivity.this,
                        getString(R.string.failed_to_update_profile, task.getException()), Toast.LENGTH_SHORT).show();
            }

        }
    });

}


// Method that updates the name and the profile photo of the user
private void updateNameAndPhoto()
{
   final String strFileName= firebaseUser.getUid() + ".jpg";

    final  StorageReference fileRef = fileStorage.child("images/"+ strFileName);
    progressBar.setVisibility(View.VISIBLE);
    fileRef.putFile(localFileUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
            progressBar.setVisibility(View.GONE);
            if(task.isSuccessful())
            {
                fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        serverFileUri = uri;

                        UserProfileChangeRequest request = new UserProfileChangeRequest.Builder()
                                .setDisplayName(etName.getText().toString().trim())
                                .setPhotoUri(serverFileUri)
                                .build();

                        firebaseUser.updateProfile(request).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    String userID = firebaseUser.getUid();
                                    databaseReference = FirebaseDatabase.getInstance().getReference().child(NodeNames.USERS);

                                    HashMap<String, String> hashMap = new HashMap<>();

                                    hashMap.put(NodeNames.NAME, etName.getText().toString().trim());
                                    hashMap.put(NodeNames.PHOTO, strFileName);

                                    databaseReference.child(userID).setValue(hashMap)
                                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                @Override
                                                public void onComplete(@NonNull Task<Void> task) {

                                                    finish();
                                                }
                                            });


                                } else {
                                    Toast.makeText(ProfileActivity.this,
                                            getString(R.string.failed_to_update_profile, task.getException()), Toast.LENGTH_SHORT).show();
                                }

                            }
                        });
                    }
                });
            }}});

}

// Method that updates only the username of the user
private void updateOnlyName()
{

    // textChanged = true;

    progressBar.setVisibility(View.VISIBLE);
    UserProfileChangeRequest request = new UserProfileChangeRequest.Builder()
            .setDisplayName(etName.getText().toString().trim())
            .build();

    firebaseUser.updateProfile(request).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            progressBar.setVisibility(View.GONE);
            if (task.isSuccessful())
            {
                String userId = firebaseUser.getUid();
                databaseReference = FirebaseDatabase.getInstance().getReference().child(NodeNames.USERS);

                HashMap<String,String> hashMap = new HashMap<>();

                hashMap.put(NodeNames.NAME, etName.getText().toString().trim());

                databaseReference.child(userId).setValue(hashMap).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {

                        finish();

                    }
                });


            }
            else
            {
                Toast.makeText(ProfileActivity.this,
                        getString(R.string.failed_to_update_profile, task.getException()) , Toast.LENGTH_SHORT).show();
            }
        }
    });

}


// Change password button
public void btnChangePasswordClick(View view)
{
    startActivity(new Intent(ProfileActivity.this, ChangePasswordActivity.class));
}


@Override
public void onBackPressed() {
    // super.onBackPressed();
    if (textChanged)
    {
        new AlertDialog.Builder(ProfileActivity.this)
                .setTitle("Save changes")
                .setMessage("You have made changes to your profile. Would you like to save them?")
                .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        if (etName.getText().toString().trim().equals(""))
                        {
                            etName.setError(getString(R.string.enter_name));
                        } else {
                            if (localFileUri!=null){
                                updateNameAndPhoto();
                            } else {
                                updateOnlyName();
                            }
                        }
                    }
                })
                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog, int which){
                        finish();
                    }
                })

                .setIcon(R.drawable.ic_save_primarycolor)
                .show();
    }
    else
    {
        finish();
    }
  }
}

Я новичок в Android Studio и кодирую с Java, не беспокойтесь: v

1 Ответ

1 голос
/ 04 августа 2020

Вы не раскрыли достаточно подробностей, но из того, что я вижу, вы, скорее всего, вызываете одну из своих функций до инициализации progressView.

Убедитесь, что ни одна из функций, которые ссылаются на ваш progressBar, не пришла перед строкой:

private View progressBar

Например, реализация ниже заставит ваше приложение скучать sh:

protected void onCreate(Bundle savedInstanceState) {
    ...
    removePhoto() // a method that references progressBar
    progressBar = findViewById(R.id.progressBar); // progressBar initialization

Таким образом, вы должны инициализировать свой progressBar перед его использованием. Если этого не сделать, вы получите исключение NullPointerException, и ваше приложение выдаст sh.

Вы также можете сделать следующее:
  • Измените тип progressBar с View на ProgressBar
  • Проверьте, действительно ли идентификатор progressBar из файла XML равен progressBar .
  • Очистите свой проект (Сборка> Очистить проект) и снова запустите.
Надеюсь, это поможет.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...