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.

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"); } 
  • ViewPager con indicador sin la biblioteca de soporte de Android
  • Cómo deshabilitar el adaptador viewpager al tocar vistas específicas?
  • Android: Debería agregar un constructor vacío a un fragmento utilizado en ViewPager
  • ¿Cómo puedo pasar una variable a través de FragmentPagerAdapter a un fragmento?
  • Fragment.onCreateView () no se llama en viewpager después del cambio de configuración
  • Dynamic Center Aligned ViewPager
  • Botón de acción flotante en una actividad - ¿cómo anclar a una vista de reciclaje en un fragmento?
  • ¿Cuál es la forma correcta de implementar un GridViewPager en Android Wear?
  • Desplazamiento de imágenes (no de diseños) con viewpager
  • Viewpager desborda la pantalla dentro del diseño del coordinador
  • Actualizar / Recargar / Re instanciar un fragmento en un sistema de pestañas android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.