un altro... non si sa mai
un altro... non si sa mai
ivan888 (27-09-13)
ma si... abbondiamo va :-D
ivan888 (27-09-13)
Bravissimo Enrico, sei finito anche sul blog di Androidiani. Complimenti. Stasera se ho tempo posto il mio codice che utilizzo per implementare il ViewPager. Alla fine é molto simile al tuo, ci sono solo alcune rivisitazioni.
Ho modificato il mio precedente intervento con del codice![]()
Ultima modifica di Crotan; 27-09-13 alle 21:31
Grande enri! Mi chiedevo proprio come facevi le transizioni animate! Grande!![]()
ivan888 (27-09-13)
bella fratello!![]()
Per memorizzare lo stato dei Fragments mettete quanto segue
1
2ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
3viewPager.setOffscreenPageLimit(3);
4
Dove 3 sono il numero dei Fragment.
Grazie a Dema121, per avermi fatto conoscere l'istruzione in questione.
grazie, utilissimo, ti nominerò nella sezione credits della mia app![]()
for (i = 2; i<2; i++) {
love(Motorola);
hate(Samsung | Apple);
}
[B]Livello di difficoltà: facile
Versione SDK utilizzata: 4.4.2
In questo tutorial spiegherò come è possibile creare un semplice wizard da mostrare all'utente al primo avvio dell'applicazione. Per fare ciò utilizzerò un ViewPager. Per ulteriori informazioni circa questo oggetto potete consultare la documentazione ufficiale: View Pager | Android Developers.
Come prima cosa creiamo i vari files xml necessari per il corretto funzionamento dell'applicazione. Rechiamoci dunque in /res/layout/ ed apriamo l'activity_main e inseriamo quanto segue.
51
2<com.example.tutorialapp.ViewPagerNoSwipe xmlns:android="http://schemas.android.com/apk/res/android"
3android:id="@+id/pager"
4android:layout_width="match_parent"
5android:layout_height="match_parent" />
Da notare il "com.example.tutorialapp.ViewPagerNoSwipe". Spiegherò tra poco a cosa serve. Andiamo in /src/ e creiamo una classe chiamata ViewPagerNoSwipe ed inseriamo al suo interno il seguente codice.
231
2public class ViewPagerNoSwipe extends ViewPager {
3
4public ViewPagerNoSwipe(Context context) {
5super(context);
6}
7
8public ViewPagerNoSwipe(Context context, AttributeSet attrs) {
9super(context, attrs);
10}
11
12
13public boolean onInterceptTouchEvent(MotionEvent arg0) {
14
15return false;
16}
17
18
19public boolean onTouchEvent(MotionEvent event) {
20
21return false;
22}
23}
Tramite questa classe disabilitiamo la possibilità di fare lo swipe tra le varie schermate del ViewPager. Abbiamo così svelato il mistero del "com.example.tutorialapp.ViewPagerNoSwipe".
Creiamo ora i vari files xml per ogni schermata (fragment) del Wizard. In questo esempio utilizzerò tre pagine, quindi, tre layout differenti.
Pagina1
241
2<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3android:layout_width="fill_parent"
4android:layout_height="fill_parent" >
5
6<TextView
7android:id="@+id/textView1"
8android:layout_width="wrap_content"
9android:layout_height="wrap_content"
10android:layout_alignParentLeft="true"
11android:layout_below="@+id/textView1"
12android:text="Benvenuto!"
13android:textSize="16dp"
14/>
15
16<Button
17android:id="@+id/button1"
18android:layout_width="wrap_content"
19android:layout_height="wrap_content"
20android:layout_alignParentBottom="true"
21android:layout_alignParentRight="true"
22android:text="Avanti" />
23
24</RelativeLayout>
Pagina2
331
2
3<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent" >
6
7<TextView
8android:id="@+id/textView1"
9android:layout_width="wrap_content"
10android:layout_height="wrap_content"
11android:layout_alignParentLeft="true"
12android:layout_below="@+id/textView1"
13android:text="Sono nel secondo Fragment!"
14android:textSize="16dp"
15/>
16
17<Button
18android:id="@+id/button1"
19android:layout_width="wrap_content"
20android:layout_height="wrap_content"
21android:layout_alignParentBottom="true"
22android:layout_alignParentRight="true"
23android:text="Avanti" />
24
25<Button
26android:id="@+id/button2"
27android:layout_width="wrap_content"
28android:layout_height="wrap_content"
29android:layout_alignParentBottom="true"
30android:layout_alignParentLeft="true"
31android:text="Indietro" />
32
33</RelativeLayout>
Pagina3
321
2<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3android:layout_width="fill_parent"
4android:layout_height="fill_parent" >
5
6<TextView
7android:id="@+id/textView1"
8android:layout_width="wrap_content"
9android:layout_height="wrap_content"
10android:layout_alignParentLeft="true"
11android:layout_below="@+id/textView1"
12android:text="Sono nell'ultimo Fragment!"
13android:textSize="16dp"
14/>
15
16<Button
17android:id="@+id/button1"
18android:layout_width="wrap_content"
19android:layout_height="wrap_content"
20android:layout_alignParentBottom="true"
21android:layout_alignParentRight="true"
22android:text="Termina" />
23
24<Button
25android:id="@+id/button2"
26android:layout_width="wrap_content"
27android:layout_height="wrap_content"
28android:layout_alignParentBottom="true"
29android:layout_alignParentLeft="true"
30android:text="Indietro" />
31
32</RelativeLayout>
Essendo il codice di facile comprensione non mi soffermo ulteriormente su descrizioni dello stesso. Proseguiamo oltre passando ora alla parte Java. Andiamo in /src/ ed apriamo la classe MainActivity inserendo quanto segue.
321public class MainActivity extends FragmentActivity{
2
3ViewPager viewPager;
4Adapter adapter;
5ActionBar actionBar;
6
7protected void onCreate(Bundle savedIstanceState) {
8super.onCreate(savedIstanceState);
9setContentView(R.layout.activity_main);
10actionBar = getActionBar();
11actionBar.setTitle("Wizard iniziale");
12viewPager = (ViewPager)findViewById(R.id.pager);
13adapter = new Adapter(getSupportFragmentManager());
14viewPager.setAdapter(adapter);
15}
16
17public ViewPager getViewPager() {
18return viewPager;
19}
20
21
22public void onBackPressed() {
23if (viewPager.getCurrentItem() == 0) {
24//Non eseguo nulla in quanto siamo nella prima pagina
25super.onBackPressed();
26} else {
27//Imposta l'item corrente prendendo il numero di tutti gli item correnti e togliendo 1
28viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
29
30}
31}
32}
Creiamo ora l'adapter per il ViewPager.
351public class Adapter extends FragmentPagerAdapter{
2
3//Il numero di pagine totali
4private int numeroPagine = 3;
5
6//Costruttore
7public Adapter(FragmentManager fm) {
8super(fm);
9// TODO Auto-generated constructor stub
10}
11
12
13//Switcha in base alla posizione
14public Fragment getItem(int arg0) {
15// TODO Auto-generated method stub
16switch(arg0) {
17case 0: return new PageFragment();
18case 1: return new PageFragment2();
19case 2: return new PageFragment3();
20}
21Fragment fragment = new PageFragment();
22Bundle arguments = new Bundle();
23arguments.putString("pageIndex", Integer.toString(arg0 + 1));
24fragment.setArguments(arguments);
25return fragment;
26}
27
28
29//Numero di pagine totali
30public int getCount() {
31// TODO Auto-generated method stub
32return numeroPagine;
33}
34
35}
La variabile "numeroPagine", come facilmente intuibile, indica il numero di pagine totali del ViewPager. Con il metodo getCount ritorniamo quel valore.
Siamo quasi giunti alla fine, creiamo per ogni file xml la corrispettiva classe estendendo Fragment.
191public class PageFragment extends Fragment{
2
3
4public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
5View view = getActivity().getLayoutInflater().inflate(R.layout.pagina1, null);
6
7Button b1 = (Button) view.findViewById(R.id.button1);
8b1.setOnClickListener(new View.OnClickListener() {
9
10public void onClick(View v) {
11((MainActivity) getActivity()).getViewPager().setCurrentItem(1);
12}
13});
14
15return view;
16
17}
18
19}
Per questioni di spazio non posto tutte le classi, che potete comunque consultare nello zip dei sorgenti in allegato, l'unica nota che mi sento di fare è la seguente: quando arrivate all'ultimo Fragment, ossia l'ultima pagina del ViewPager, dovreste utilizzare le SharedPreferences per far si che il Wizard non sia mostrato sempre ad ogni avvio dell'applicazione. Per fare questo utilizzeremo una boolean.
61private void memorizzaValore(String key, boolean value) {
2SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
3Editor editor = sharedPreferences.edit();
4editor.putBoolean(key, value);
5editor.commit();
6}
Successivamente, nel metodo onClickListener del Button
41memorizzaValore("GuidaCompletata", true);
2Toast.makeText(getActivity(), "Preferenze salvate", Toast.LENGTH_SHORT).show();
3Intent intent = new Intent(getActivity(), HomePage.class);
4startActivity(intent);
In questo modo abbiamo salvato le preferenze, ma ancora non è finita. Nella classe HomePage dobbiamo controllare se effettivamente la variabile booleana ha un valore di true o false. Quindi, in HomePage inseriamo
111preferenze = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
2attivo = preferenze.getBoolean("GuidaCompletata", false);
3
4if(attivo) {
5
6}
7
8else {
9intent = new Intent(getApplicationContext(), MainActivity.class);
10startActivity(intent);
11}
Questo è tutto ! Per ulteriori chiarimenti potete scrivere in questa discussione.
Giupy_99 (07-01-14),leonardodettoileo (07-01-14)