Estoy usando el paquete support.v4
de Android para desarrollar un ViewPager que contiene múltiples Fragment
s.Fragmentos de ViewPager que se destruyen con el tiempo?
Intento ocultar las Vistas cuando el usuario cambia de página. Entonces, implementé un OnPageChangeListener
para escuchar mi adaptador, y llamé a un método update()
en mi Fragment
s cuando ocurre un cambio de página. Pero obtengo un NullPointerException
, y no puedo entender por qué.
Aquí está el código:
public class MyActivity extends FragmentActivity implements
OnPageChangeListener {
private static final int NUM_ITEMS = 2;
private ViewPager mPager;
private static SpaceAdapter mAdapter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_pager);
mAdapter = new SpaceAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mPager.setOnPageChangeListener(this);
}
public static class SpaceAdapter extends FragmentPagerAdapter {
public SpaceAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new MyFragment();
case 1:
return new MyFragment();
default:
return new MyFragment();
}
}
}
@Override
public void onPageScrollStateChanged(int arg0) {
Log.i("pagination", "scroll state changed: " + arg0);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// Log.i("pagination", "page scroll: " + arg0 + " with: " + arg1 + ", " + arg2);
if (mAdapter.getItem(arg0) instanceof IUpdateOnPage) {
((IUpdateOnPage) mAdapter.getItem(arg0)).updateOnPage();
}
}
@Override
public void onPageSelected(int arg0) {
Log.i("pagination", "page selected: " + arg0);
}
}
y
public class MyFragment extends Fragment implements
SurfaceHolder.Callback, IUpdateOnPage {
private SurfaceView charts;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.crew, null);
bindViews(v);
return v;
}
private void bindViews(View v) {
charts = (SurfaceView) v.findViewById(R.id.civ_charts);
charts.getHolder().addCallback(this);
Log.i("wtf", "huh " + String.valueOf(charts == null)); // logs false
}
@Override
public void updateOnPage() {
if (charts != null) {
Log.i("crew surface", "hidden");
charts.setVisibility(View.GONE);
} else {
Log.i("crew surface", "charts is null"); //THIS HERE gets logged
}
}
}
wCuando copio/pegar Quité los métodos SurfaceHolder.Callback
, pero están ahí. El método bindViews(v)
registra si charts == null
, y eso siempre devuelve falso. Cuando llamo, se llama a updateOnPage
, y charts == null
devuelve verdadero. ¿Por qué sucede esto y cómo lo soluciono?
y esto es la línea 108:
charts.setVisibility(View.GONE);
bien, después de una investigación adicional, supongo que el fragmento se destruye cuando comienza la paginación (¿aunque la vista permanezca?). al deslizar, aún puedo ver "la mitad" del fragmento hasta que el nuevo fragmento encaje en la vista completa. Entonces, si todas las referencias se recopilan y todo lo que queda es la vista, ¿cómo puedo hacer esto? – edthethird
si obtiene una 'NullPointerException', ¿puede publicar la salida de logcat? –
Bueno, de hecho estoy atrapándolo así que no se lanza una excepción. El problema es 'charts.setVisibility (View.GONE);'. gráficos es nulo. Está al final de la segunda muestra de código, justo encima del 'else'. Se agregó rastro de pila. – edthethird