android-fragments 空对象引用上的android.content.Context.getPackageName()

6qfn3psc  于 2022-11-13  发布在  Android
关注(0)|答案(7)|浏览(181)

从片段转换到Activity时,我遇到此错误,如下所示:

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);

到目前为止,我在网上还没有看到任何解决方案。

tquggr8v

tquggr8v1#

我用这段代码来处理这个片段

private Context context;

context.startActivity(new Intent(context, MainActivity.class));
46scxncf

46scxncf2#

我已经找到了一个解决这个问题的方法。我意识到我得到这个错误是因为我在firebase OnCompleteListener中创建了新的Intent,如下所示。所以当我从侦听器中删除它并在外部调用它之后,我的程序就可以正常工作了。
相反,我创建了一个全局布尔变量,在成功存储数据时将其更新为true。然后,我可以在其他地方访问它,如果为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();
                                    }
                                }
                            });
rslzwgfq

rslzwgfq3#

大家好,我也意识到这个错误的一个主要原因是生命周期方法。所以我在我的片段中覆盖它们来更新firebase数据库上的用户状态。因此,每当我试图移动到管理它的主Activity时,它们都会导致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");
        }
4c8rllxm

4c8rllxm4#

由于您是从*Fragment*进行呼叫,因此您应该在此处使用getActivity(),而非getContext()

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

我希望这能帮上忙。

ztyzrc3y

ztyzrc3y5#

有时startActivity方法会抛出如下异常:
从活动上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是您想要的吗?
所以你应该intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

ercv8c1e

ercv8c1e6#

您似乎得到了错误的上下文,该上下文引发了此NullPointerException
尝试替换下面的行:

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

使用:〉〉如果您在活动中

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

with:〉〉如果您在Activity的回调侦听器中

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

如果您在片段中,请使用:〉〉

Intent mainIntent = new Intent (requireActivity(), MainActivity.class);
jhkqcmku

jhkqcmku7#

请尝试在getContext()的内部使用getActivity()

相关问题