android.content.Context.getPackageName()'在null对象引用上

时间:2015-02-14 11:14:19

标签: android android-fragments fragment

您好我正在使用实现接口的Fragments。

public class SigninFragment extends Fragment implements SigninInterface 

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

@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
    }

}

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

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

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

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)

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

17 个答案:

答案 0 :(得分:34)

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

public MainActivity activity;

@Override
public void onAttach(Activity activity){
    this.activity = activity;
}

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

Intent mIntent = new Intent(activity, MusicHome.class);

答案 1 :(得分:21)

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

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

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...

在onCreate之前引用this导致&#34; java.lang.NullPointerException:尝试调用虚方法&#39; java.lang.String android.content.Context.getPackageName()&#39 ;在null对象引用&#34;我的错误。

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

public class MyFragment extends FragmentActivity {
    private SharedPreferences sharedPref ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //...
        sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

希望有所帮助。

答案 2 :(得分:18)

android API level 23.。

使用

  

的getContext()

而不是

  

getActivity()

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

在这里你可以使用

  

MyActivity.this

而不是

  

getActivity()/ getApplicationContext()

答案 3 :(得分:4)

对我来说问题是我将Activity传递给构造函数,而不是Context

public Adapter(Activity activity, List<MediaItem> items, boolean can) {
    mItems = items;
    canEdit = can;
    mActivity = activity;
}

并将此活动用于getDefaultSharedPreferences(),因此我将Activity更改为Context并且仍然使用MainActivity.this调用Adapter构造函数

答案 4 :(得分:3)

你只需要这样做:

Intent myIntent = new Intent(MainActivity.this, nextActivity.class);

答案 5 :(得分:3)

在我的情况下,错误发生在此行的Fragment内:

Intent intent = new Intent(getActivity(), SecondaryActivity.class);

当我双击触发上述代码的项目时发生这种情况,因此同时启动了两个SecondaryActivity.class个活动,一个在另一个上面。我通过按下后退按钮关闭了热门SecondaryActivity.class活动,该按钮触发了getActivity()中前往SecondaryActivity.class的{​​{1}}来电。对getActivity()的调用已返回null。 这是一种奇怪的Android bug,所以通常不应该发生。

答案 6 :(得分:3)

在我的情况下,我在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);
                }
            });

我更改为从当前视图获取上下文

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

答案 7 :(得分:1)

我的课程没有扩展到Activiti。 我用这种方式解决了这个问题。

class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter {
          ...
 holder.title.setOnClickListener({v->
                v.context.startActivity(Intent(context,  HomeActivity::class.java))
            })
          ...
    }

答案 8 :(得分:1)

在活动之前放置片段名称

Intent mIntent = new Intent(SigninFragment.this.getActivity(),MusicHome.class);

答案 9 :(得分:0)

有时 startActivity 方法会抛出异常,尤其是在 Fragments 中:

startActivity() 上下文外部调用 Activity 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?

所以你应该intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)方法

答案 10 :(得分:0)

在科特林

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
     views=inflater.inflate(R.layout.fragment_dashboard, container, false)
   Toast.makeText(views.context ,"hello",Toast.LENGTH_LONG).show()
   
}

答案 11 :(得分:0)

使用可以在全局范围内使用

Context context;

并创建一个构造函数并传递上下文。 LoginClass是类的名称

LoginClass(Context context)
{this.context=context;}

,当我们调用该类时,请使用getApplicationContext 喜欢 LoginClass lclass = new LoginClass(getApplicationContext) 就是这样。

答案 12 :(得分:0)

  public MessageAdapter(Context context, List<Messages> mMessageList) {

    this.mContext = context;
    this.mMessageList = mMessageList;

  }

答案 13 :(得分:0)

由于在API23及更高版本中不推荐使用onAttach,因此... 在我的片段中,每次进入片段时,我都要事先声明并设置parentActivity。最有可能发生的原因是我们按下后退按钮导致上下文变为空。因此,下面是我的解决方法。

private Activity parentActivity;

public void onStart(){
        super.onStart();
        parentActivity = getActivity();
//...

}

答案 14 :(得分:0)

您可以轻松解决问题并在活动中的任何位置使用活动,只需将活动存储如下:

public class MainActivity extends AppCompatActivity{
      Context context = this;

      protected void onCreate(Bundle savedInstanceState) {....}

      AnotherClass {
          Intent intent = new Intent(context, ExampleActivity.class);
          intent.putExtra("key", "value");
          startActivity(intent);
      }

}

答案 15 :(得分:0)

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

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

Toast.makeText(getContext(), "text", Toast.LENGTH_SHORT).show();

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

简单的解决方案:在删除片段之前,先致电getContext()

答案 16 :(得分:0)

您可以使用try / catch解决问题。 当用户在开始意图之前关闭应用程序时会发生此崩溃。

try
{
    Intent mIntent = new Intent(getActivity(),MusicHome.class);
    mIntent.putExtra("SigninFragment.user_details", bundle);
    startActivity(mIntent);
}
catch (Exception e) {
    e.printStackTrace();
}