CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: ryouza con ben 1 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: carotix con ben 11 Thanks ricevuti negli ultimi sette giorni
Utente del mese: megthebest con ben 26 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 4 su 4
Discussione:

[Facile] Creazione di un semplice wizard

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Androidiani Power User L'avatar di Crotan


    Registrato dal
    Jul 2013
    Località
    Roma
    Messaggi
    1,265
    Smartphone
    Redmi Note 9 Pro

    Ringraziamenti
    401
    Ringraziato 1,445 volte in 626 Posts
    Predefinito

    [Facile] Creazione di un semplice wizard

    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"
    2
        android:id="@+id/pager"
    3
        android:layout_width="match_parent"
    4
        android: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.

    x
     
    1
    public class ViewPagerNoSwipe extends ViewPager {
    2
    3
        public ViewPagerNoSwipe(Context context) {
    4
            super(context);
    5
        }
    6
    7
        public ViewPagerNoSwipe(Context context, AttributeSet attrs) {
    8
            super(context, attrs);
    9
        }
    10
    11
        @<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
    12
        public boolean onInterceptTouchEvent(MotionEvent arg0) {
    13
           
    14
            return false;
    15
        }
    16
    17
        @<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
    18
        public boolean onTouchEvent(MotionEvent event) {
    19
           
    20
            return 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

    24
     
    1
    <?xml version="1.0" encoding="utf-8"?>
    2
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3
        android:layout_width="fill_parent"
    4
        android:layout_height="fill_parent" >
    5
    6
        <TextView
    7
            android:id="@+id/textView1"
    8
            android:layout_width="wrap_content"
    9
            android:layout_height="wrap_content"
    10
            android:layout_alignParentLeft="true"
    11
            android:layout_below="@+id/textView1"
    12
            android:text="Benvenuto!"
    13
            android:textSize="16dp"
    14
            />
    15
    16
        <Button
    17
            android:id="@+id/button1"
    18
            android:layout_width="wrap_content"
    19
            android:layout_height="wrap_content"
    20
            android:layout_alignParentBottom="true"
    21
            android:layout_alignParentRight="true"
    22
            android:text="Avanti" />
    23
    24
    </RelativeLayout>


    Pagina2

    32
     
    1
    <?xml version="1.0" encoding="utf-8"?>
    2
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3
        android:layout_width="fill_parent"
    4
        android:layout_height="fill_parent" >
    5
    6
        <TextView
    7
            android:id="@+id/textView1"
    8
            android:layout_width="wrap_content"
    9
            android:layout_height="wrap_content"
    10
            android:layout_alignParentLeft="true"
    11
            android:layout_below="@+id/textView1"
    12
            android:text="Sono nel secondo Fragment!"
    13
            android:textSize="16dp"
    14
            />
    15
    16
        <Button
    17
            android:id="@+id/button1"
    18
            android:layout_width="wrap_content"
    19
            android:layout_height="wrap_content"
    20
            android:layout_alignParentBottom="true"
    21
            android:layout_alignParentRight="true"
    22
            android:text="Avanti" />
    23
       
    24
        <Button
    25
            android:id="@+id/button2"
    26
            android:layout_width="wrap_content"
    27
            android:layout_height="wrap_content"
    28
            android:layout_alignParentBottom="true"
    29
            android:layout_alignParentLeft="true"
    30
            android:text="Indietro" />
    31
    32
    </RelativeLayout>


    Pagina3

    32
     
    1
    <?xml version="1.0" encoding="utf-8"?>
    2
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3
        android:layout_width="fill_parent"
    4
        android:layout_height="fill_parent" >
    5
    6
        <TextView
    7
            android:id="@+id/textView1"
    8
            android:layout_width="wrap_content"
    9
            android:layout_height="wrap_content"
    10
            android:layout_alignParentLeft="true"
    11
            android:layout_below="@+id/textView1"
    12
            android:text="Sono nell'ultimo Fragment!"
    13
            android:textSize="16dp"
    14
            />
    15
    16
        <Button
    17
            android:id="@+id/button1"
    18
            android:layout_width="wrap_content"
    19
            android:layout_height="wrap_content"
    20
            android:layout_alignParentBottom="true"
    21
            android:layout_alignParentRight="true"
    22
            android:text="Termina" />
    23
       
    24
        <Button
    25
            android:id="@+id/button2"
    26
            android:layout_width="wrap_content"
    27
            android:layout_height="wrap_content"
    28
            android:layout_alignParentBottom="true"
    29
            android:layout_alignParentLeft="true"
    30
            android: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.

    32
     
    1
    public class MainActivity extends FragmentActivity{
    2
       
    3
        ViewPager viewPager;
    4
        Adapter adapter;
    5
        ActionBar actionBar;
    6
       
    7
        protected void onCreate(Bundle savedIstanceState) {
    8
            super.onCreate(savedIstanceState);
    9
            setContentView(R.layout.activity_main);
    10
            actionBar = getActionBar();
    11
            actionBar.setTitle("Wizard iniziale");
    12
            viewPager = (ViewPager)findViewById(R.id.pager);
    13
            adapter = new Adapter(getSupportFragmentManager());
    14
            viewPager.setAdapter(adapter);
    15
            }
    16
       
    17
        public ViewPager getViewPager() {
    18
            return viewPager;
    19
        }
    20
       
    21
        @<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
    22
        public void onBackPressed() {
    23
            if (viewPager.getCurrentItem() == 0) {
    24
                //Non eseguo nulla in quanto siamo nella prima pagina
    25
                super.onBackPressed();
    26
            } else {
    27
                //Imposta l'item corrente prendendo il numero di tutti gli item correnti e togliendo 1
    28
                viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
    29
               
    30
            }
    31
        }
    32
    }


    Creiamo ora l'adapter per il ViewPager.
    36
     
    1
    2
    public class Adapter extends FragmentPagerAdapter{
    3
    4
        //Il numero di pagine totali
    5
        private int numeroPagine = 3;
    6
       
    7
        //Costruttore
    8
        public Adapter(FragmentManager fm) {
    9
            super(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
    15
        public Fragment getItem(int arg0) {
    16
            // TODO Auto-generated method stub
    17
            switch(arg0) {
    18
                case 0: return new PageFragment();
    19
                case 1: return new PageFragment2();
    20
                case 2: return new PageFragment3();
    21
            }
    22
            Fragment fragment = new PageFragment();
    23
            Bundle arguments = new Bundle();
    24
            arguments.putString("pageIndex", Integer.toString(arg0 + 1));
    25
            fragment.setArguments(arguments);
    26
            return 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
    31
        public int getCount() {
    32
            // TODO Auto-generated method stub
    33
            return 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.

    19
     
    1
    public class PageFragment extends Fragment{
    2
       
    3
        @<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
    4
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    5
            View view = getActivity().getLayoutInflater().inflate(R.layout.pagina1, null);
    6
           
    7
            Button b1 = (Button) view.findViewById(R.id.button1);
    8
            b1.setOnClickListener(new View.OnClickListener() {
    9
                @<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
    10
                public void onClick(View v) {
    11
                    ((MainActivity) getActivity()).getViewPager().setCurrentItem(1);
    12
                }
    13
            });
    14
           
    15
            return 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.

    6
     
    1
    private void memorizzaValore(String key, boolean value) {
    2
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    3
            Editor editor = sharedPreferences.edit();
    4
            editor.putBoolean(key, value);
    5
            editor.commit();
    6
        }


    Successivamente, nel metodo onClickListener del Button

    4
     
    1
    memorizzaValore("GuidaCompletata", true);
    2
                    Toast.makeText(getActivity(), "Preferenze salvate", Toast.LENGTH_SHORT).show();
    3
                    Intent intent = new Intent(getActivity(), HomePage.class);
    4
                    startActivity(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

    11
     
    1
    preferenze = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    2
            attivo = preferenze.getBoolean("GuidaCompletata", false);
    3
    4
            if(attivo) {
    5
    6
            }
    7
           
    8
            else {
    9
                intent = new Intent(getApplicationContext(), MainActivity.class);
    10
                startActivity(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.
    Ultima modifica di Crotan; 23-10-15 alle 12:19

  2. I seguenti 4 Utenti hanno ringraziato Crotan per il post:

    aeroxr1 (06-08-14),KlaasMad (30-01-14),nikita1977 (05-03-15),wuby (23-11-14)

  3.  
  4. #2
    Androidiani Power User L'avatar di Crotan


    Registrato dal
    Jul 2013
    Località
    Roma
    Messaggi
    1,265
    Smartphone
    Redmi Note 9 Pro

    Ringraziamenti
    401
    Ringraziato 1,445 volte in 626 Posts
    Predefinito

    Riservato per future aggiunte.

  5. #3
    Senior Droid


    Registrato dal
    May 2012
    Messaggi
    442

    Ringraziamenti
    39
    Ringraziato 17 volte in 16 Posts
    Predefinito

    Come mai l'oggetto viene richiamato così nel layout ?
    Non capisco a cosa serve nel linguaggio android questa stringa :
    codice:
     xmlns:android="http://schemas.android.com/apk/res/android"
    Le altre domande erano che avevo posto erano delle cavolate assurde =P

    EDIT : credo di aver trovato la risposta :
    http://stackoverflow.com/questions/7...ndroid-must-be

    Ora provo a finire di seguire il tutorial


    edit2 :
    Implement this method to intercept all touch screen motion events. This allows you to watch events as they are dispatched to your children, and take ownership of the current gesture at any point.

    Using this function takes some care, as it has a fairly complicated interaction with View.onTouchEvent(MotionEvent), and using it requires implementing that method as well as this one in the correct way. Events will be received in the following order:

    You will receive the down event here.
    The down event will be handled either by a child of this view group, or given to your own onTouchEvent() method to handle; this means you should implement onTouchEvent() to return true, so you will continue to see the rest of the gesture (instead of looking for a parent view to handle it). Also, by returning true from onTouchEvent(), you will not receive any following events in onInterceptTouchEvent() and all touch processing must happen in onTouchEvent() like normal.
    For as long as you return false from this function, each following event (up to and including the final up) will be delivered first here and then to the target's onTouchEvent().
    If you return true from here, you will not receive any following events: the target view will receive the same event but with the action ACTION_CANCEL, and all further events will be delivered to your onTouchEvent() method and no longer appear here.
    Parameters
    ev The motion event being dispatched down the hierarchy.
    Returns
    Return true to steal motion events from the children and have them dispatched to this ViewGroup through onTouchEvent(). The current target will receive an ACTION_CANCEL event, and no further messages will be delivered here.
    Non capisco bene come funzioni il tutto :/
    E questa è la parte che mi crea più dubbi :
    The down event will be handled either by a child of this view group, or given to your own onTouchEvent() method to handle; this means you should implement onTouchEvent() to return true, so you will continue to see the rest of the gesture (instead of looking for a parent view to handle it). Also, by returning true from onTouchEvent(), you will not receive any following events in onInterceptTouchEvent() and all touch processing must happen in onTouchEvent() like normal.

    se faccio ritornare true alla funzione onInterceptTouchEvent() l'evento intercettato è passato all'onTouchEvent() o il contrario ?
    Ultima modifica di aeroxr1; 07-08-14 alle 13:13

  6. #4
    Androidiano di Riferimento L'avatar di wuby


    Registrato dal
    May 2012
    Località
    genova
    Messaggi
    4,105
    Smartphone
    s6

    Ringraziamenti
    725
    Ringraziato 2,211 volte in 1,665 Posts
    Predefinito

    Grazie!!!!

    guida molto apprezzata... anche se a causa delle mie limitate conoscenze di java (per non dire inesistenti) ci ho messo 3hr a capire come integrarlo nella struttura dell'app che avevo già iniziato.. quando poi ho risolto gli errori, e l'ho messa sul cell partiva perfettamente il wizard, ma poi crashava la HomeActivity.. dopo essermi fatto venire qualche capello bianco, ho capito che non l'avevo dichiarata nel manifest hahahahhaha

    ancora grazie per le guide che ci scrivete..
    "Se guardate in cielo e vedete una stella a forma di moto non vi preoccupate, è il SIC" cit. VR46
    "Forse gli spagnoli dovrebbero giocare un po di più a carte, così almeno si rilassano. Pero tira il culo a perdere anche a carte." cit. SIC58

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy