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
- Texto en PagerTabStrip no se muestra en la primera vista
- ¿Cómo puedo detectar un clic en un oyente onTouch?
- Cuestión de gesto con mapview en la página de viewpager
- Android usando viewPager vs usando tabhost
- ViewPager dentro de la fila ListView impide que onItemClick sea despedido
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.
- Ficha de fragmento de Android con viewpager para todos los api
- Flip imágenes en un viewpager
- ViewPager con la barra de herramientas y TabLayout tiene altura incorrecta
- Swipe Gesture aplicado al nivel de fragmento junto con ViewPager con su desplazamiento predeterminado desactivado
- SwipeRefreshLayout intercepta con ViewPager
- ViewPager y FragmentPagerAdapter con fragmentos (no la biblioteca de soporte)
- Determinar el fragmento visible en ViewPager
- NullPointerException en FrameLayout.onMeasure ()
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"); }
- No se puede agregar window-token android.os.BinderProxy no es válido; ¿Está funcionando su actividad?
- Método Gradle DSL no encontrado: 'compile ()'