android .content.Context.getPackageName () для пустой ссылки на объект - PullRequest
0 голосов
/ 28 апреля 2020

Я получаю эту ошибку при переходе от фрагмента к действию, как показано ниже:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference         at android.content.ComponentName.<init>(ComponentName.java:130)         at android.content.Intent.<init>(Intent.java:6108)

Ниже приведен мой код для перехода к следующему действию. Ошибка возникает в первой строке кода. ниже.

  Intent mainIntent = new Intent (getContext(), MainActivity.class);
            mainIntent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity (mainIntent);

Пока я не вижу решения в сети.

Ответы [ 6 ]

1 голос
/ 30 апреля 2020

Здравствуйте, ребята. Я также осознал, что одной из главных причин этой ошибки являются методы жизненного цикла. Поэтому я переопределил их внутри своего фрагмента, чтобы обновить состояние пользователя в базе данных Firebase. Из-за этого они вызывали ошибку android.content.Context.getPackageName() on a null object reference всякий раз, когда я пытался перейти к основному виду деятельности, управляющему им. В случае, если я использовал переход фрагмента для перехода к другому фрагменту, MainActivity выполнялась более двух раз. После остановки, чтобы переопределить их, мое приложение работало должным образом. Если бы кто-то объяснил, почему это происходит, было бы здорово.

   @Override
        public void onStart() {
            super.onStart();
    updateUserState("Online");
        }
@Override
        public void onResume() {
            super.onResume();
    updateUserState("Online");
        }
1 голос
/ 28 апреля 2020

Мне удалось найти работу вокруг этого. Я понял, что получаю ошибку, потому что я создаю новое намерение внутри FireCase OnCompleteListener, как показано ниже. Поэтому после того, как я удалил его из слушателя и вызвал его снаружи, моя программа работает правильно.

Вместо этого я создал глобальную логическую переменную, которую я обновил до true при успешном хранении данных. Затем я могу получить к нему доступ в другом месте, а затем перейти к другому, если это правда.

 #BEFORE

    PostsRef.child(key).updateChildren(postsMap)
                                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                                        @Override
                                        public void onComplete(@NonNull Task<Void> task) {
                                            if (task.isSuccessful()) {
                                                Toast.makeText(getActivity(), "New Post is updated successfully.", Toast.LENGTH_SHORT).show();
                                                Intent mainIntent = new Intent (getActivity(), MainActivity.class);
                                                mainIntent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                                startActivity (mainIntent);
                                            } else {
                                                Toast.makeText(context, "Error occured while updating your post.", Toast.LENGTH_SHORT).show();
                                            }
                                        }
                                    });
#AFTER

 PostsRef.child(key).updateChildren(postsMap)
                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()) {
                                        mSuccess = true;
                                        Toast.makeText(getActivity(), "New Post is updated successfully.", Toast.LENGTH_SHORT).show();
                                    } else {
                                        Toast.makeText(context, "Error occured while updating your post.", Toast.LENGTH_SHORT).show();
                                    }
                                }
                            });
1 голос
/ 28 апреля 2020

Поскольку вы звоните с фрагмента , вам следует использовать getActivity () здесь вместо getContext ()

Intent mainIntent = new Intent (getActivity(), MainActivity.class);
        mainIntent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity (mainIntent);

Это должно помочь, я надеюсь.

1 голос
/ 28 апреля 2020

Кажется, вы получаете неправильный контекст, который вызывает это NullPointerException

Попробуйте заменить строку ниже:

Intent mainIntent = new Intent (getContext(), MainActivity.class);

на: >> если вы находитесь в пределах действие

Intent mainIntent = new Intent (this, MainActivity.class);

с: >> если вы находитесь внутри прослушивателя обратного вызова внутри действия

Intent mainIntent = new Intent (MyActivityName.this, MainActivity.class);     

с: >> если вы находитесь внутри фрагмента

Intent mainIntent = new Intent (requireActivity(), MainActivity.class);
1 голос
/ 28 апреля 2020

Я работаю транзакцию фрагмента с этим кодом

private Context context;

context.startActivity(new Intent(context, MainActivity.class)); 
1 голос
/ 28 апреля 2020

Пожалуйста, попробуйте с getActivity () intsead getContext ()

...