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.
1<com.example.tutorialapp.ViewPagerNoSwipe xmlns:android="http://schemas.android.com/apk/res/android"
2android:id="@+id/pager"
3android:layout_width="match_parent"
4android: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.
x1public class ViewPagerNoSwipe extends ViewPager {
2
3public ViewPagerNoSwipe(Context context) {
4super(context);
5}
6
7public ViewPagerNoSwipe(Context context, AttributeSet attrs) {
8super(context, attrs);
9}
10
11<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
12public boolean onInterceptTouchEvent(MotionEvent arg0) {
13
14return false;
15}
16
17<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
18public boolean onTouchEvent(MotionEvent event) {
19
20return false;
21}
22}
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
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 nel secondo 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="Avanti" />
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>
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<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
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.
361
2public class Adapter extends FragmentPagerAdapter{
3
4//Il numero di pagine totali
5private int numeroPagine = 3;
6
7//Costruttore
8public Adapter(FragmentManager fm) {
9super(fm);
10// TODO Auto-generated constructor stub
11}
12
13<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
14//Switcha in base alla posizione
15public Fragment getItem(int arg0) {
16// TODO Auto-generated method stub
17switch(arg0) {
18case 0: return new PageFragment();
19case 1: return new PageFragment2();
20case 2: return new PageFragment3();
21}
22Fragment fragment = new PageFragment();
23Bundle arguments = new Bundle();
24arguments.putString("pageIndex", Integer.toString(arg0 + 1));
25fragment.setArguments(arguments);
26return fragment;
27}
28
29<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
30//Numero di pagine totali
31public int getCount() {
32// TODO Auto-generated method stub
33return numeroPagine;
34}
35
36}
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<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
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<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
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}
Sorgenti caricati su Dropbox: LINK
Come utilizzare il metodo getActionBar() su API inferiori alle 11?
Per poter usare questo metodo su Gingerbread è necessario inserire nel proprio progetto la libreria di support v7 ed estendere ActionBarActivity, successivamente sostituire getActionBar() con getSupportActionBar().Maggiori informazioni su come importare la libreria nel vostro progetto sono disponibili qui: Support Library Setup | Android Developers.
Il risultato finale dovrebbe essere simile a questo
![]()
![]()
Per ulteriori chiarimenti potete scrivere in questa discussione.