2015-02-18 18 views
13

Sto lavorando con CustomView che estende alcune visualizzazioni Android come FrameLayout. Nel mio layout utilizzo un ViewPager con un PagerAdapter personalizzato.Android Visualizza onSaveInstanceState non chiamato

Il problema è che il mio Vistanon ripristinare suo stato quando il frammento è nuovamente attaccato al ViewPager/Activity. Ad esempio, ho tre frammenti, se faccio scorrere l'ultimo e ritorna al primo, ScrollView non è dove lo lascio: è tornato di default, in cima.

So che con un PagerAdapter, non tutti i frammenti sono attivi allo stesso tempo, fondamentalmente giustificano il + 1/-1.

Non riesco a trovare il motivo per cui il mio View.onSaveInstanceState() non viene chiamato, così come onRestoreInstanceState.

risposta

22

La risposta facile: è perché non stavo impostando id per la mia vista (personalizzata o no). Android non ha gestito il onSaveInstanceState/onRestoreInstanceState se nessun ID è impostato per la vista.

Così come il mio customView stava estendendo la vista di base, con non la proprietà extra, l'impostazione di un ID per la vista risolto il problema e così onSaveInstanceState/onRestoreInstanceState sono chiamati come dovrebbe.

Quindi, per sintesi, utilizzare uno di questo approccio:

da XML

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    ... 
    android:id="@+id/scrollView"> 
</ScrollView> 

O da Java

yourCustomView.setId(R.id.myCustomView); 

è ultimo caso, si aggiunge id statico res/values ​​/ ids.xml <item name="myCustomView" type="id"/>

+1

per me questo non funziona su un cambio di orientamento con layout diversi per orizzontale e verticale. OnSaveInstanceState viene chiamato, ma onRestoreInstanceState non è – Boy

+0

@Boy sto avendo lo stesso problema. è la tua vista all'interno di un frammento che è ospitato su un viewpager? –

+0

@AndreaBaccega è proprio così. Sembra che ViewPager faccia anche il ripristino dei frammenti – Boy

3

Stato di salvataggio per impostazione predefinita

Ora abbiamo tutto a posto perché la nostra vista salvi e ripristini il suo stato. Tuttavia, questo non accadrà per impostazione predefinita. Se si desidera che le istanze di immagine per salvare lo stato automaticamente, è possibile aggiungere questa riga al metodo init:

setSaveEnabled(true); 

o meno di fare questo dipende da voi. Anche se la vista non salva stato per impostazione predefinita, gli utenti della vista possono sempre abilitare lo stato di salvataggio chiamando setSaveEnabled (true) o specificando android: saveEnabled = "true" nel layout xml.

Problemi correlati