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

Kar*_* Ve 64 android fragment android-fragments

嗨,我正在使用实现接口的Fragments.

public class SigninFragment extends Fragment implements SigninInterface 
Run Code Online (Sandbox Code Playgroud)

片段类中接口的方法实现如下.

@Override
public void afterSubmitClicked(String userId, Bundle bundle) {

    Log.d(TAG,"Calling time afterSubmitClicked called"+bundle);

    if(!userId.equals("-1")){
        //Logged in successfully
        //Move to MusicHome

        Intent mIntent = new Intent(getActivity(),MusicHome.class);
        mIntent.putExtra("SigninFragment.user_details", bundle);
        startActivity(mIntent);

    }else{
        //Logging in failed
        //show error dialog
    }

}
Run Code Online (Sandbox Code Playgroud)

在执行AsynchronousTask(扩展AsyncTask)类之后调用此方法.

但是我崩溃了.并显示错误消息

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
Run Code Online (Sandbox Code Playgroud)

logcat的

   02-14 16:37:04.648: E/AndroidRuntime(28177): Process: com.raaga.android, PID: 28177
02-14 16:37:04.648: E/AndroidRuntime(28177): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.content.ComponentName.<init>(ComponentName.java:77)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.content.Intent.<init>(Intent.java:3996)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.fragments.SigninFragment.afterSubmitClicked(SigninFragment.java:152)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.java:92)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.java:1)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.AsyncTask.finish(AsyncTask.java:632)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.Handler.dispatchMessage(Handler.java:102)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.Looper.loop(Looper.java:135)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.app.ActivityThread.main(ActivityThread.java:5221)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at java.lang.reflect.Method.invoke(Native Method)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at java.lang.reflect.Method.invoke(Method.java:372)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Run Code Online (Sandbox Code Playgroud)

我试过自己并在Google上进行过探索.但我没有得到任何解决方案.有人可以帮忙吗?

Kar*_* Ve 37

我发现了我所做的错误.我们需要从覆盖方法OnAttach()获取活动实例例如,

public MainActivity activity;

@Override
public void onAttach(Activity activity){
    this.activity = activity;
}
Run Code Online (Sandbox Code Playgroud)

然后将活动作为上下文传递如下.

Intent mIntent = new Intent(activity, MusicHome.class);
Run Code Online (Sandbox Code Playgroud)

  • @ Menna-AllahSami`onAttach(Context context)`不是. (6认同)
  • onAttach已弃用 (5认同)
  • @ Menna-AllahSami以活动为参数的人,是的.采取背景的人不是. (3认同)
  • 对我来说似乎是一个android bug,但是很好的解决方法为我解决了这个问题! (2认同)
  • 我不知道这如何解决问题,但它有效。 (2认同)

mix*_*x3d 27

这个问题的答案帮助我找到了我的问题,但我的来源不同,所以希望这可以揭示有人找到这个页面寻找"随机"上下文崩溃的答案:

我已经指定了一个SharedPreferences对象,并尝试在它的类级声明中实例化它,如下所示:

public class MyFragment extends FragmentActivity {
    private SharedPreferences sharedPref =
        PreferenceManager.getDefaultSharedPreferences(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
Run Code Online (Sandbox Code Playgroud)

this在onCreate之前引用导致"java.lang.NullPointerException:尝试在空对象引用上调用虚方法'java.lang.String android.content.Context.getPackageName()'"对我来说是错误的.

在onCreate()中实例化对象解决了我的问题,如下所示:

public class MyFragment extends FragmentActivity {
    private SharedPreferences sharedPref ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //...
        sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


siv*_*E35 19

android API等级23.

使用

的getContext()

代替

getActivity()

getActivity()给出父Activity,一个Context对象

在这里你可以使用

MyActivity.this

代替

getActivity()/ getApplicationContext()

  • 我使用getContext()得到了相同的NPE (2认同)

ren*_*arg 10

我在尝试在片段中显示 Toast 时遇到了同样的问题。

经过一些调试后,我发现我在调用之前删除了片段:

Toast.makeText(getContext(), "text", Toast.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)

因为片段已被移除,上下文变为空,从而导致异常。

简单的解决方案:getContext() 在删除片段之前调用。


vov*_*ost 8

在我的情况下,错误发生Fragment在这一行的a 内:

Intent intent = new Intent(getActivity(), SecondaryActivity.class);
Run Code Online (Sandbox Code Playgroud)

它发生在我双击触发上面代码的项目时,因此SecondaryActivity.class同时启动了两个活动,一个在另一个之上。我关上SecondaryActivity.class通过触发调用按后退按钮活动getActivity()SecondaryActivity.class其来到前台。对 的调用getActivity()返回null。这是某种奇怪的Android错误,因此通常不应该发生。您可以在用户点击一次后阻止点击。


Mih*_*hai 6

就我而言,我在 recyclerview 适配器、上下文上下文中有一个 onCLick 方法;一开始。

 holder.cTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context, StoryActivity.class);
                    intent.putExtra("STORY", mComments.get(position));
                    context.startActivity(intent);
                }
            });
Run Code Online (Sandbox Code Playgroud)

我改变了从当前视图中获取上下文

 holder.cTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(v.getContext(), StoryActivity.class);
                    intent.putExtra("STORY", mComments.get(position));
                    v.getContext().startActivity(intent);
                }
            });
Run Code Online (Sandbox Code Playgroud)