Sto utilizzando il pacchetto Android support.v4
per sviluppare un ViewPager contenente più Fragment
s.I frammenti di ViewPager vengono distrutti nel tempo?
Sto cercando di nascondere le Visualizzazioni quando l'utente cambia pagina. Quindi, ho implementato un OnPageChangeListener
per ascoltare il mio adattatore e chiamare un metodo update()
nel mio Fragment
s quando si verifica una modifica della pagina. Ma ricevo un NullPointerException
e non riesco a capire perché.
Ecco il codice:
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);
}
}
e
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
}
}
}
wQuando copio/incollato ho rimosso i SurfaceHolder.Callback
metodi, ma ci sono. Il metodo bindViews(v)
registra se charts == null
e che restituisce sempre false. Alla pagina I, viene chiamato updateOnPage
e charts == null
restituisce true. Perché succede questo e come faccio a girarlo?
e questa è la linea 108:
charts.setVisibility(View.GONE);
ok, dopo ulteriori indagini, presumo che il frammento venga distrutto all'inizio dell'impaginazione (anche se la vista rimane?). quando si scorre, posso ancora vedere "metà" del frammento fino a quando il nuovo frammento non scatta a piena vista. Quindi, se tutti i riferimenti vengono raccolti e tutto ciò che rimane è la vista, come posso fare questo? – edthethird
se stai ricevendo un 'NullPointerException', puoi pubblicare l'output logcat? –
beh, in realtà lo sto prendendo in modo che non venga generata un'eccezione. Il problema è 'charts.setVisibility (View.GONE);'. i grafici sono nulli. È alla fine del secondo campione di codice, proprio sopra il 'else'. Aggiunto traccia dello stack. – edthethird