Intenta invocar el método virtual 'java.lang.String android.content.Context.getPackageName ()' en una referencia de objeto nulo

Tengo una Activity , que en sí tiene tres Fragment .

En uno de estos fragmentos, hay un RecyclerView con un adaptador personalizado, y hacer clic en uno de sus elementos iría a otra página, que es una nueva instancia de la misma Activity . Sin embargo, un determinado comportamiento provoca un error en mi aplicación.

Desde mi Actividad, al hacer clic en uno de los elementos, aparecerá la nueva instancia de la misma Actividad, lo cual está bien. Entonces presiono el botón de la parte posterior y me llevan de nuevo a la primera actividad. Pero al hacer clic en uno de estos elementos de nuevo (para iniciar una nueva instancia de la misma actividad) produce el siguiente error:

java.lang.NullPointerException: Intenta invocar el método virtual 'java.lang.String android.content.Context.getPackageName ()' en una referencia de objeto nulo

También es importante considerar que estoy llamando a la nueva instancia de la Actividad (es decir, donde están los tres ítems), en uno de los fragmentos que tengo en mi Actividad. Así que, cuando lo llamo, tengo algo como:

 public class MyActivity extends AppCompatActivity { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... ViewPager viewPager = (ViewPager) findViewById(R.id.detail_viewpager); viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager())); TabLayout tabLayout = (TabLayout) findViewById(R.id.detail_tabs); tabLayout.setTabTextColors( ContextCompat.getColor(this, R.color.text_white_secondary), ContextCompat.getColor(this, R.color.text_white)); tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(this, R.color.white)); tabLayout.setupWithViewPager(viewPager); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); } ... public class ViewPagerAdapter extends FragmentPagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return 3; } @Override public Fragment getItem(int position) { switch (position) { case 0: return new MainFragment(); case 1: return new MyFragment(); case 2: return new MyOtherFragment(); } return null; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.tab_main_frag).toUpperCase(l); case 1: return getString(R.string.tab_my_frag).toUpperCase(l); case 2: return getString(R.string.tab_my_other_frag).toUpperCase(l); } return null; } } ... public static class MyFragment extends Fragment implements MyRVAdapter.OnEntryClickListener { ... private ArrayList<ItemObj> mArrayList; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... doStuff(); ... } private void doStuff() { ... mArrayList = ...; MyRVAdapter adapter = new MyRVAdapter(getActivity(), mArrayList); adapter.setOnEntryClickListener(new MyRVAdapter.OnEntryClickListener() { @Override public void onEntryClick(View view, int position) { Intent intent = new Intent(getActivity(), MyActivity.class); intent.putExtra("INFORMATION", mArrayList.get(position)); startActivity(intent); } }); } ... } ... } 

Y aquí es parte de mi adaptador personalizado:

 public class MyRVAdapter extends RecyclerView.Adapter<MyRVAdapter.MyViewHolder> { public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { ... MyViewHolder(View itemView) { super(itemView); itemView.setOnClickListener(this); ... } @Override public void onClick(View v) { // The user may not set a click listener for list items, in which case our listener // will be null, so we need to check for this if (mOnEntryClickListener != null) { mOnEntryClickListener.onEntryClick(v, getLayoutPosition()); } } } private Context mContext; private ArrayList<ItemObj> mArray; public MyRVAdapter(Context context, ArrayList<ItemObj> array) { mContext = context; mArray = array; } @Override public int getItemCount() { return mArray.size(); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.tile_simple, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { ItemObj anItem = mArray.get(position); ... } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); } private static OnEntryClickListener mOnEntryClickListener; public interface OnEntryClickListener { void onEntryClick(View view, int position); } public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener) { mOnEntryClickListener = onEntryClickListener; } } 

Aquí está el error en su totalidad:

 01-23 14:07:59.083 388-388/com.mycompany.myapp E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mycompany.myapp, PID: 388 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:77) at android.content.Intent.<init>(Intent.java:4570) at com.mycompany.myapp.MyActivity$MyFragment$1.onEntryClick(MyActivity.java:783) at com.mycompany.myapp.adapter.MyRVAdapter$MyViewHolder.onClick(MyRVAdapter.java:42) at android.view.View.performClick(View.java:5197) at android.view.View$PerformClick.run(View.java:20926) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5951) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 

El error apunta a la primera línea: Intent intent = new Intent(getActivity(), MyActivity.class); (del fragmento) primero, con la línea después (en el error) apuntando a mOnEntryClickListener.onEntryClick(v, getLayoutPosition()); desde el método onClick overriden en el adaptador personalizado.

También he leído respuestas similares, pero no han resuelto mi problema.

Editar:

Mediante el uso:

 if (getActivity() == null) { Log.d(LOG_TAG, "Activity context is null"); } else { Intent intent = new Intent(getActivity(), MyActivity.class); intent.putExtra("INFORMATION", mArrayList.get(position)); startActivity(intent); } 

en la clase interna ( onEntryClick ) en el fragmento, encontré que llamar getActivity() devuelve null .

4 Solutions collect form web for “Intenta invocar el método virtual 'java.lang.String android.content.Context.getPackageName ()' en una referencia de objeto nulo”

Por lo tanto, el tema es esta línea

 private static OnEntryClickListener mOnEntryClickListener; 

Dado que es estático, tiene una única instancia de la clase en tiempo de ejecución. Al hacer clic en un elemento, se crea una segunda instancia de la misma Actividad y se crea otra instancia de mOnEntryClickListener , sobrescribiendo la anterior. Por lo tanto, al pulsar de nuevo para volver a la primera instancia de la actividad, está utilizando la instancia de mOnEntryClickListener de la segunda actividad que se ha destruido.

El problema probablemente esté relacionado con su OnClickListener anónimo que captura el método getActivity() del fragmento original. Puede intentar implementar OnClickListener en su MyFragment y ver si el comportamiento cambia en absoluto (puede que no sea tan simple):

 public static class MyFragment extends Fragment implements View.OnClickListener { ... private void doStuff() { button.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(getActivity(), MyActivity.class); intent.putExtra("INFORMATION", value); startActivity(intent); } ... } 

Editar: Este es un hack y no algo que generalmente recomendaría, pero puede ayudarle a resolver el problema si usted está en un apuro …

Amplíe la Application para proporcionar una instancia de aplicación estática:

 public class MyApplication extends Application { private static MyApplication _instance; @Override public void onCreate() { super.onCreate(); _instance = this; } public static MyApplication getInstance() { return _instance; } } 

Modifique su AndroidManifest.xml para que su aplicación ejecute MyApplication :

 <application android:name="com.package.MyApplication" <!-- Rest of your manifest --> 

A continuación, reemplace getActivity() con una llamada a MyApplication.getInstance() :

 private void doStuff() { ... mArrayList = ...; MyRVAdapter adapter = new MyRVAdapter(getActivity(), mArrayList); adapter.setOnEntryClickListener(new MyRVAdapter.OnEntryClickListener() { @Override public void onEntryClick(View view, int position) { Intent intent = new Intent(MyApplication.getInstance(), MyActivity.class); intent.putExtra("INFORMATION", mArrayList.get(position)); startActivity(intent); } }); } 

intenta usar mi solución: en tu MyActivity, crea una nueva función:

 public void openAnotherActivity(ObjectItem item) { Intent intent = new Intent(MyApplication.getInstance(), MyActivity.class); intent.putExtra("INFORMATION", item); startActivity(intent); } 

A continuación, modifique doStuff () como:

  private void doStuff() { ... mArrayList = ...; MyRVAdapter adapter = new MyRVAdapter(getActivity(), mArrayList); adapter.setOnEntryClickListener(new MyRVAdapter.OnEntryClickListener() { @Override public void onEntryClick(View view, int position) { openAnotherActivity(mArrayList.get(position)) } }); } 

No estoy seguro de que pueda ayudarle o no, pero creo que al menos puede resolver el problema de context

En el creador de su fragmento, mantenga la referencia de su actividad y compruebe si su actividad está en estado reanudado antes de iniciar otra actividad.

 public static class MyFragment extends Fragment implements MyRVAdapter.OnEntryClickListener { ... private ArrayList<ItemObj> mArrayList; private MyActivity mActivity; @Override public void onCreate(Bundle savedInstanceState) { mActivity = getActivity(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... doStuff(); ... } private void doStuff() { ... mArrayList = ...; MyRVAdapter adapter = new MyRVAdapter(getActivity(), mArrayList); adapter.setOnEntryClickListener(new MyRVAdapter.OnEntryClickListener() { @Override public void onEntryClick(View view, int position) { if (!mActivity.isFinishing() { Intent intent = new Intent(mActivity, MyActivity.class); intent.putExtra("INFORMATION", mArrayList.get(position)); startActivity(intent); } } }); } ... } 
  • RecyclerViewAdapter.notifyDataSetChanged () en una referencia de objeto nulo
  • NullPointerException en CustomArrayAdapter
  • En la facturación de aplicaciones v3 NullPointerException
  • ¿Qué es una NullPointerException y cómo puedo solucionarlo?
  • Null en el android studio
  • La inspección muestra la excepción de puntero nulo mientras compruebo la probabilidad nula
  • NullPointerException getDefaultSharedPreferences ()
  • Nullpointerexception en getView de ArrayAdapter personalizado
  • ¿Por qué estoy obteniendo nullpointer en onMeasure en GridView
  • Android java.lang.RuntimeException: No se puede instanciar la actividad ComponentInfo ... java.lang.NullPointerException
  • Excepción de puntero nulo al usar el paquete para pasar datos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.