Actividad de inicio de Fragmento causa NullPointerException

Estoy atascado aquí con un problema de iniciar una actividad de un botón dentro de un fragmento. Aquí está mi código:

ViewPagerAdapter.java

import java.util.List; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; public class ViewPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragments; public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) { super(fm); this.fragments = fragments; } @Override public int getCount() { return this.fragments.size(); } @Override public Fragment getItem(int position) { return this.fragments.get(position); } } 

ViewPagerActivity.java

 import java.util.List; import java.util.Vector; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.util.Log; import com.package.here.Class1Overview; import com.package.here.Class1Overview; import com.package.here.Class1Overview; public class ViewPagerActivity extends FragmentActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.viewpager); ViewPager pager = (ViewPager)super.findViewById(R.id.my_viewpager); pager.setAdapter(initialisePaging()); } private ViewPagerAdapter initialisePaging() { List<Fragment> fragments = new Vector<Fragment>(); fragments.add(Fragment.instantiate(this, Class1Overview.class.getName())); fragments.add(Fragment.instantiate(this, Class2Overview.class.getName())); fragments.add(Fragment.instantiate(this, Class3Overview.class.getName())); return new ViewPagerAdapter(super.getSupportFragmentManager(), fragments); } } 

Class1Overview.java (Aquí está el botón)

 import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import com.package.here.R; public class FuelOverview extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) { return null; } View v = (LinearLayout)inflater.inflate(R.layout.class_one_layout, container, false); View AddBtn = v.findViewById(R.id.btn_add); ((Button) AddBtn).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(getActivity(), ActivityToStart.class); startActivity(intent); } }); return v; } } 

Y este es mi LogCat :

 01-05 19:39:00.913: E/AndroidRuntime(10557): Uncaught handler: thread main exiting due to uncaught exception 01-05 19:39:01.034: E/AndroidRuntime(10557): java.lang.RuntimeException: Unable to pause activity {com.package.here/com.package.here.ViewPagerActivity}: java.lang.NullPointerException 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3162) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3119) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3102) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.app.ActivityThread.access$2400(ActivityThread.java:119) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1870) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.os.Handler.dispatchMessage(Handler.java:99) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.os.Looper.loop(Looper.java:123) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.app.ActivityThread.main(ActivityThread.java:4363) 01-05 19:39:01.034: E/AndroidRuntime(10557): at java.lang.reflect.Method.invokeNative(Native Method) 01-05 19:39:01.034: E/AndroidRuntime(10557): at java.lang.reflect.Method.invoke(Method.java:521) 01-05 19:39:01.034: E/AndroidRuntime(10557): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 01-05 19:39:01.034: E/AndroidRuntime(10557): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 01-05 19:39:01.034: E/AndroidRuntime(10557): at dalvik.system.NativeStart.main(Native Method) 01-05 19:39:01.034: E/AndroidRuntime(10557): Caused by: java.lang.NullPointerException 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1576) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1617) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:481) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.app.Activity.performSaveInstanceState(Activity.java:1022) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1180) 01-05 19:39:01.034: E/AndroidRuntime(10557): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3144) 01-05 19:39:01.034: E/AndroidRuntime(10557): ... 12 more 01-05 19:39:01.423: I/dalvikvm(10557): threadid=7: reacting to signal 3 

ViewPager en sí funciona bien. Parece ser un error haciendo una pausa en la FragmentActivity, pero no puedo entenderlo. Lo único que encontré fue este post en google http://code.google.com/p/android/issues/detail?id=19917

También obtuve a través del código de ejemplo de google para asegurarse de que principalmente utilizan la misma técnica …

Editar: para asegurarse de que el ClickListener funciona, he intentado un brindis en el método onClick – funciona perfectamente.

4 Solutions collect form web for “Actividad de inicio de Fragmento causa NullPointerException”

Este es un problema conocido y me sorprende encontrar que nadie ha presentado un error en el rastreador de errores público para esto.

Su problema se deriva de esto:

 if (f.mSavedViewState != null) { if (result == null) { result = new Bundle(); } result.putSparseParcelableArray( FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); } if (!f.mUserVisibleHint) { // Only add this if it's not the default value result.putBoolean(FragmentManagerImpl.USER_VISIBLE_HINT_TAG, f.mUserVisibleHint); } 

Usted debe notar que si el result es null viene en este código y el primero if no se dispara obtendrá una NullPointerException si entramos en el segundo if .

Debe leer:

 if (f.mSavedViewState != null) { if (result == null) { result = new Bundle(); } result.putSparseParcelableArray( FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); } if (!f.mUserVisibleHint) { if (result == null) { result = new Bundle(); } // Only add this if it's not the default value result.putBoolean(FragmentManagerImpl.USER_VISIBLE_HINT_TAG, f.mUserVisibleHint); } 

He enviado un parche para esto hace una semana o dos: https://android-review.googlesource.com/31261

La solución rápida es

 class MyFragment extends Fragment { @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); setUserVisibleHint(true); } 

Y espera la actualización en modo seguro 🙂

De acuerdo con un mensaje aquí , debe utilizar FragmentStatePagerAdapter en lugar de FragmentPagerAdapter. Tuve el mismo problema que describió, y hacer que el interruptor funcionó para mí.

Acabo de tener el mismo problema – el problema para mí fue causado cuando agregué un nuevo fragmento a mi proyecto con una disposición vacía. Parece que si no se guarda nada en el paquete durante Fragment.onSaveInstanceState(Bundle outState) causa una excepción de puntero nulo en FragmentManagerImpl.saveFragmentBasicState .

La adición de algunas vistas a mis diseños arregló el problema (después de horas gastado golpeando mi cabeza contra una pared). Uso de la biblioteca de soporte de android v4 revision 10.

También cuando se utiliza un ListView como la raíz del diseño del fragmento, si el listview no tiene elementos, también obtendrá el bloqueo. En la clase de fragmentos, onSaveInstanceState como este para poner algunos datos en el lote:

 @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("DO NOT CRASH", "OK"); } 
  • Cómo establecer el tamaño de ViewPager
  • El menú deslizante bloquea el evento táctil en la vista superior
  • Cambiar de TabHost a Fragmentos con Viewpager: Donde poner todo mi código
  • PagerTitleStrip no muestra títulos en la primera página de visualización, los títulos sólo se dibujan después de pasar a otra página
  • Cómo implementar PageTransformer con pestañas deslizables
  • Cambio de la cuenta de ViewPager
  • NestedScrollView contiene contenido menor que la altura de la pantalla Desplaza en CoordinatorLayout
  • Android ViewPager con WebView no muestra la imagen incrustada con estilo
  • Creación de un diseño de cuadro de mandos como fragmento mediante programación
  • ¿Es este efecto posible en viewpager?
  • Iniciar animación cuando el fragmento es visible en ViewPager
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.