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
- Android FragmentPagerAdapter con LoaderManager
- Aplicar fuerza cerrar en viewPager.setAdapter (adaptador)
- Vinculación y desvinculación de Android Service a / de Fragment (en ViewPager)
- Detección de eventos de toque / toque en un viewpager
- Android: intenta invocar el método virtual 'void android.support.v4.app.Fragment.setMenuVisibility (boolean)' en una referencia de objeto nulo
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.
- Diferenciación entre desplazamiento de usuario y cambio de página de programación en ViewPager
- Crear un ViewPager infinito desplazándose en una dirección
- ViewPager no actualiza el tamaño de fuente textview instantáneamente
- Imágenes en lugar de textos de título en las pestañas del widget ViewPagerIndicator
- ¿Cómo puedo inhabilitar todos los eventos táctiles en todos los niños de un ViewGroup?
- ViewPager - personalización del título PagerTabStrip
- Android Poner la animación en la página de desplazamiento en la vista paginador utilizando fragmento
- Actualizar la actividad de la fuente antes de la transición de salida
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 ()'