Autore Topic: [medio] Il nuovo SlidingPaneLayout  (Letto 5217 volte)

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
[medio] Il nuovo SlidingPaneLayout
« il: 20 Giugno 2013, 15:14:46 CEST »
+5
Livello di difficoltà: medio
Target SDK: 17
Min SDK: 11
Link al file compresso del progetto eclipse: file in allegato

Il tutorial descrive il nuovo componente SlidingPaneLayout (SPL) introdotto recentemente da Google.

Cosa è SPL
Nel Google I/O 2013 Google ha rilasciato la nuova app Google Hangouts.
Questa applicazione è costruita con un nuovo componente chiamato SlidingPaneLayout e distribuito con la support library release 13.

Il componente permette la gestione automatica di un dual-pane, una videata in cui ci sono due pannelli, uno a sx (di solito una lista) e uno a destra di dettaglio.
Se lo spazio è sufficiente per avere entrambi i pannelli (esempio un tablet) allora vengono mostrati entrambi, nel caso in cui lo spazio non è sufficiente, uno dei due pannelli viene in parte sovrapposto dall'altro.
Il miglior esempio è Google Hangouts.



Questo componente non va confuso con il Navigation Drawer. Non sono la stessa cosa e hanno funzionalità ed impieghi diversi.
Il Navigation Drawer è indipendente dalla densità del device, e deve essere utilizzato per la navigazione fra le funzioni (sia top level, sia lower level).
Lo SlidingPaneLayout invece ha un comportamente che varia in funzione del contenuto e della densità del device, e deve essere utilizzato in un contesto in cui è necessario un dual pane, dove sono presenti dei dati contestuali (l'esempio è la lista degli hangouts).

Come implementarlo
Innanzitutto dobbiamo aggiornare la support library alla versione 13.

Il primo passo per utilizzare il componente è realizzare un layout con due figli.
Codice (XML): [Seleziona]
<android.support.v4.widget.SlidingPaneLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/sliding_pane_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >

    <!--
        The first child view becomes the left pane. When the combined
        desired width (expressed using android:layout_width) would
        not fit on-screen at once, the right pane is permitted to
        overlap the left.-->

    <fragment
       android:id="@+id/list_pane"
       android:name="it.gmariotti.android.examples.slidingpane.MyListFragment"
       android:layout_width="280dp"
       android:layout_height="match_parent"
       android:layout_gravity="left" ></fragment>

    <!--
        The second child becomes the right (content) pane. In this
        example, android:layout_weight is used to express that this
        pane should grow to consume leftover available space when the
        window is wide enough. This allows the content pane to
        responsively grow in width on larger screens while still
        requiring at least the minimum width expressed by
        android:layout_width.  -->

    <fragment
       android:id="@+id/content_pane"
       android:name="it.gmariotti.android.examples.slidingpane.DetailFragment"
       android:layout_width="450dp"
       android:layout_height="match_parent"
       android:layout_weight="1"
       android:paddingLeft="16dp"
       android:paddingRight="16dp"  ></fragment>

</android.support.v4.widget.SlidingPaneLayout>
Dovendo gestire uno schermo multipane, è normale aspettarsi un layout con due parti.
La prima parte è il Master (left pane) che solitamente avrà una lista o un elenco.
La seconda parte (detail pane) generalmente contiene il dettaglio legato all'elemento selezionato nella lista.

Abbiamo definito per entrambi gli elementi la dimensione (android:layout_width="280dp" per la lista, android:layout_width="450dp" per il dettaglio).
Il componente gestisce in autonomia la propria visualizzazione calcolando se la somma delle parti eccede la parte visualizzabile nel device.
In questo caso automaticamente i due pannelli si sovrappongono in autonomia.
E' importante specificare android:layout_weight="1" nel secondo pannello; in questo modo il componente quando si sovrappone va a riempire tutto lo spazio disponibile.

Agganciamo il nostro layout ad una Activity.
Codice (Java): [Seleziona]
public class MainActivity extends Activity {

        private SlidingPaneLayout mSlidingLayout;
        private ActionBar mActionBar;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
        }
}

public class MyListFragment extends ListFragment {
       
        private ArrayAdapter<String> mAdapter;

        public static final String[] items = { "Item 1: xxxxxxxxxxxxxxxxx",
                        "Item 2: xxxxxxxxxxxxxxxxx", "Item 3: xxxxxxxxxxxxxxxxx",
                        "Item 4: xxxxxxxxxxxxxxxxx", "Item 5: xxxxxxxxxxxxxxxxx",
                        "Item 6: xxxxxxxxxxxxxxxxx", "Item 7: xxxxxxxxxxxxxxxxx" };
                       
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);

                mAdapter = new ArrayAdapter<String>(getActivity(),
                                android.R.layout.simple_list_item_1, items);
                setListAdapter(mAdapter);
        }
}

public class DetailFragment extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.detail_fragment,container,false);
                return view;
        }
       
        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
                inflater.inflate(R.menu.detail , menu);
        }
}

Se mandiamo in esecuzione il codice è sufficiente per avere un SPL grezzo ma funzionante.

Qui sotto vediamo il componente su uno smartphone dove lo spazio non è sufficiente per contenere entrambi i pannelli.


Qui troviamo il componente su un tablet dove lo spazio è sufficiente.


Vediamo come poter interagire con gli eventi generati (apertura e chiusura del pannello).

Questo passaggio è molto importante. Interagire con questi eventi ci permette di gestire gli eventi ad esse collegati, come la modifica degli elementi nella ActionBar (titoli e icone).

Per farlo dobbiamo utilizzare un listener, il SimplePanelSlideListener.
Codice (Java): [Seleziona]
public class MainActivity extends Activity {

        private SlidingPaneLayout mSlidingLayout;
        private ActionBar mActionBar;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                ActionBar = getActionBar();
                mSlidingLayout = (SlidingPaneLayout) findViewById(R.id.sliding_pane_layout);

                mSlidingLayout.setPanelSlideListener(new SliderListener());
                mSlidingLayout.openPane();
        }      
}

Con questo codice, nella nostra Activity agganciamo il componente SPL, lo leghiamo ad un listener e lo apriamo con il metodo openPane().

Codice (Java): [Seleziona]
/**
 * This panel slide listener updates the action bar accordingly for each
 * panel state.
 */

private class SliderListener extends SlidingPaneLayout.SimplePanelSlideListener {

        @Override
        public void onPanelOpened(View panel) {
                Toast.makeText(panel.getContext(), "Opened", Toast.LENGTH_SHORT).show();
                panelOpened();
        }

        @Override
        public void onPanelClosed(View panel) {
                Toast.makeText(panel.getContext(), "Closed", Toast.LENGTH_SHORT).show();
                panelClosed();
        }

        @Override
        public void onPanelSlide(View view, float v) {}
}
Questo listener si preoccupa di gestire gli eventi di :
  • chiusura con il metodo onPanelClosed(View panel)
  • apertura con il metodo onPanelOpened(View panel)
  • sliding con il metodo onPanelSlide

Nel nostro caso, semplicemente andiamo a mostrare un Toast quando si apre o si chiude il componente.



Un aspetto importantissimo è la gestione delle icone della ActionBar.
E' indispensabile poter mostrare per ciascuna funzione e in base al pannello aperto (se master o se detail) le relative icone.
Per la natura del componente e di come viene generato, alcuni meccanismi ai quali siamo abituati con i fragment non sono automatici.

Codice (Java): [Seleziona]
public class MyListFragment extends ListFragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
               
                setHasOptionsMenu(true);
                return super.onCreateView(inflater, container, savedInstanceState);
        }
       
        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
                inflater.inflate(R.menu.list, menu);
        }
}

public class DetailFragment extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.detail_fragment,container,false);
                setHasOptionsMenu(true);
                return view;
        }
       
        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
                inflater.inflate(R.menu.detail , menu);
        }

}      

Abbiamo inserito in entrambi i fragment un menu tramite onCreateOptionsMenu e specificando setHasOptionsMenu(true);.

Sarà il nostro listener a gestire quale menù visualizzare.
Codice (Java): [Seleziona]
        /**
         *
         * @param panel
         */

        private void panelClosed() {
           
                getFragmentManager().findFragmentById(R.id.content_pane).setHasOptionsMenu(true);
                getFragmentManager().findFragmentById(R.id.list_pane).setHasOptionsMenu(false);
        }

Questo codice viene richiamato dal listener quando il pannello si chiude (quindi è visibile il pannello di dettaglio a destra). Le funzioni che ovviamente voglio far vedere sono quelle relative al dettaglio.



Analogamente voglio fare qualcosa di simile quando il pannello si apre ed è visibile il pannello master di sinistra.

Codice (Java): [Seleziona]
/**
 *
 * @param panel
 */

private void panelOpened() {
   
           if (mSlidingLayout.isSlideable()) {
                  getFragmentManager().findFragmentById(R.id.content_pane).setHasOptionsMenu(false);
                  getFragmentManager().findFragmentById(R.id.list_pane).setHasOptionsMenu(true);
           } else {
                  getFragmentManager().findFragmentById(R.id.content_pane).setHasOptionsMenu(true);
                  getFragmentManager().findFragmentById(R.id.list_pane).setHasOptionsMenu(false);
           }
}

Dobbiamo gestire anche il caso in cui il pannello non "slideable" (perchè lo spazio è sufficiente ad avere entrambi i livelli). E possiamo farlo in base a quello che vogliamo ottenere con lo stesso meccanismo.



Utilizziamo lo stesso metodo per interagire con l'ActionBar in modo da mostrare e nascondere  l'icona "Up".

Codice (Java): [Seleziona]
        private void panelClosed() {
                mActionBar.setDisplayHomeAsUpEnabled(true);
                mActionBar.setHomeButtonEnabled(true);
                ...
        }

        private void panelOpened() {
                mActionBar.setHomeButtonEnabled(false);
                mActionBar.setDisplayHomeAsUpEnabled(false);
                .....
   }  

Le linee guida, suggeriscono di mostrare l'icona Up quando il pannello di destra è aperto e sovrapposto alla lista.



Per gestire il touch sull'icona Up utilizziamo il classico metodo:

Codice (Java): [Seleziona]
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                /*
                 * The action bar up action should open the slider if it is currently
                 * closed, as the left pane contains content one level up in the
                 * navigation hierarchy.
                */

                if (item.getItemId() == android.R.id.home && !mSlidingLayout.isOpen()) {
                        mSlidingLayout.openPane();
                        return true;
                }
                return super.onOptionsItemSelected(item);
        }


Un ulteriore aspetto da gestire è il click sulla lista nel pannello di sinistra.
La gestione è in questo caso tradizionale.

Codice (Java): [Seleziona]
public class MyListFragment extends ListFragment {

   ListFragmentItemClickListener iItemClickListener;

   /** An interface for defining the callback method */
   public interface ListFragmentItemClickListener {
                /**
                * This method will be invoked when an item in the ListFragment is
                * clicked
                */

                void onListFragmentItemClick(View view, int position);
   }
 
        /** A callback function, executed when this fragment is attached to an activity */
    @Override
    public void onAttach(Activity activity) {
                super.onAttach(activity);
                try{
                        // This statement ensures that the hosting activity implements
                        // ListFragmentItemClickListener
                        iItemClickListener = (ListFragmentItemClickListener) activity;
                }catch(Exception e){
                        Toast.makeText(activity.getBaseContext(), "Exception",Toast.LENGTH_SHORT).show();
                }
    }
 
   @Override
   public void onListItemClick(ListView list, View view, int position, long id) {

                /**
                * Invokes the implementation of the method onListFragmentItemClick in
                * the hosting activity
                */

                iItemClickListener.onListFragmentItemClick(view, position);
   }
}

public class MainActivity extends Activity implements
                ListFragmentItemClickListener {

        @Override
        public void onListFragmentItemClick(View view, int position) {
                mActionBar.setTitle(MyListFragment.items[position]);
                mSlidingLayout.closePane();
        }
}

In questo caso, semplicemente chiudiamo il pannello e modifichiamo il titolo.
In una gestione "normale" probabilmente andremo a rimpiazzare il fragment di dettaglio con la relativa gestione.



C'è un ultimo aspetto da gestire.
Dobbiamo poter gestire la prima visualizzazione, cioè quando il layout viene generato la prima volta, in modo tale da poter valorizzare la action bar e le icone in modo adeguato.

Codice (Java): [Seleziona]
public class MainActivity extends Activity implements
                ListFragmentItemClickListener {
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {

        ......
                mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(
                   new FirstLayoutListener());
 
        }

         /**
          * This global layout listener is used to fire an event after first layout
          * occurs and then it is removed. This gives us a chance to configure parts
          * of the UI that adapt based on available space after they have had the
          * opportunity to measure and layout.
          */

         private class FirstLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
                @Override
                public void onGlobalLayout() {

                        if (mSlidingLayout.isSlideable() && !mSlidingLayout.isOpen()) {
                                panelClosed();
                        } else {
                                panelOpened();
                        }
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                                mSlidingLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        } else {
                                mSlidingLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                        }
                }
        }
 }



I sorgenti del progetto SlidingPaneLayout li trovate aggiornati su GitHub SlidingPaneLayout

Bibliografia:

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #1 il: 20 Giugno 2013, 18:57:06 CEST »
0
una sola precisazione:
se usate a destra (a anche a sinistra) una view che è scrollabile orizzonalmente, otterrete dei malfunzionamenti. In questi casi, dovete prendervi il sorgente del dragHandler e personalizzarlo. Purtroppo non c'è altro modo (per ora).
Un esempio è il caso di fragment  con mappa a destra, è un bel caos gestirlo!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline AR64SH

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #2 il: 19 Settembre 2013, 20:45:23 CEST »
0
Vorrei un informazione: come faccio a far si che quando è aperto il pannello sinistro il pannello destro non appaia di un colore diverso? Mi spiego meglio. Ho impostato un grigio scuro, quasi nero per il pannello di destra ma se mi sposto verso sinitra il pannello di destra viene visualizzato grigio chiaro chiaro.
Altra cosa, come si fa a far vedere il pannello sinistro anche quando si effettuo uno swype a destra? Cioè come fare a permettere la visualizzazione di entrambi i pannelli sia in apertura che in chiusura?
Grazie :)

Offline crc_error

  • Utente junior
  • **
  • Post: 85
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Windows 8, Ubuntu 12
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #3 il: 11 Ottobre 2013, 13:35:14 CEST »
+1
Grazie :)
Molto chiaro e soprattutto molto utile ;)

Mi permetto di aggiungere il passaggio dati tra la lista e il dettaglio che non c'è

MainActivity.class

Codice (Java): [Seleziona]
    @Override
    public void onListFragmentItemClick(View view, int position) {

        // aggiungere prima della chiusura
        DetailFragment dett = (DetailFragment) getFragmentManager().findFragmentById(R.id.content_pane);
        if (dett == null) {
            dett = new DetailFragment();
            getFragmentManager().beginTransaction().replace(R.id.content_pane, newFragment).commit();
        }

        dett.aggiornaDettaglio(position);


    }


DetailFragment.class
Codice (Java): [Seleziona]
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        testo = (TextView) getActivity().findViewById(R.id.detailsText);

    }

    public void aggiornaDettaglio(int id) {
        testo.setText("Selezionato item " + (id+1));
    }

« Ultima modifica: 11 Ottobre 2013, 14:46:41 CEST da crc_error »

Offline Peppin2o

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 8.1 Pro x64
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #4 il: 08 Gennaio 2014, 12:05:24 CET »
0
Salve ragazzi.

Innanzitutto vorrei ringraziare GabMarioPower per il fantastico ed esauriente tutorial e crc_error per la dritta sul passaggio dei dati (fino ad ora avevo lavorato poco con i fragment e grazie a questo e all'altro tutorial sui fragment ne ho capito le potenzialità al volo).

Ora, veniamo a noi: ho una app che gestisce tramite lo SlidingPane due liste di prodotti (nel pannello sinistro ho delle categorie di oggetti, in quello destro una lista di oggetti dipendenti dall'item cliccato nel pannello sinistro). Vorrei inserire sotto lo sliding pane una lista di riepilogo degli oggetti selezionati di volta in volta dagli utenti nella parte destra dello sliding pane.

Le mie domande sono: è possibile? Se sì, in quale file xml andrebbe aggiunta la lista? E la sua gestione a livello di codice andrebbe inserita nell'onCreate() del MainActivity (sempre riferendomi al tutorial)?

Grazie delle risposte in anticipo ;)

Offline crc_error

  • Utente junior
  • **
  • Post: 85
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Windows 8, Ubuntu 12
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #5 il: 08 Gennaio 2014, 12:21:57 CET »
+1
Ciao, credo si possa fare.


L'xml da modificare è quello della activity, in pratica devi creare una viewgroup (un linearlayout, relative, o quello che ti è più comodo) che racchiude lo slidingpanel e il gruppo di view da visualizzare sotto.


Una cosa più o meno così..
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

    <android.support.v4.widget.SlidingPaneLayout
       android:id="@+id/sliding_pane_layout"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_above="@+id/llRiepilogoItemSel">

        <fragment
           android:id="@+id/list_pane"
           android:name="com.example.nomedellatuaapp.nomeClasseFrg1"
           android:layout_width="280dp"
           android:layout_height="match_parent"
           android:layout_gravity="left" />

        <fragment
           android:id="@+id/content_pane"
           android:name="com.example.nomedellatuaapp.nomeClasseFrg1"
           android:layout_width="450dp"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:paddingLeft="16dp"
           android:paddingRight="16dp"  />

    </android.support.v4.widget.SlidingPaneLayout>

    <LinearLayout
       android:id="@+id/llRiepilogoItemSel"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true">

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Etichetta"/>

        <TextView
           android:id="@+id/tvNumItemSelected"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="NUM ITEM SEL"/>

    </LinearLayout>

</RelativeLayout>


Per la gestione "item selezionati" devi mettere una interfaccia anche nel fragment di destra e implementarla nella activity (se anche a destra usi una listactivity, il codice da mettere nel fragment e nella activity è più o meno lo stesso che ho postato sopra per il frag di sinistra).




Ciao

Offline Peppin2o

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 8.1 Pro x64
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #6 il: 08 Gennaio 2014, 12:25:47 CET »
0
mmmm si, credo di aver capito più o meno!

Grazie delle info! Sei gentilissimo ;)

Offline crc_error

  • Utente junior
  • **
  • Post: 85
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Windows 8, Ubuntu 12
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #7 il: 08 Gennaio 2014, 12:31:46 CET »
+1
Prego ;)

PS. secondo me, forse, anzichè lasciare la banda con il totale degli item selezionati sempre visibile, sarebbe meglio fare una viewgroup (fragment destro + totale) e inserirla nello sliding panel.
In modo che sia visibile solo sui tablet o se lo sliding è chiuso.
Una cosa così (ho fatto a occhio, controlla che non ci sian cavolate ;) )

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>


<android.support.v4.widget.SlidingPaneLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/sliding_pane_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent">


    <fragment
       android:id="@+id/list_pane"
       android:name="com.example.nomedellatuaapp.nomeClasseFrg1"
       android:layout_width="280dp"
       android:layout_height="match_parent"
       android:layout_gravity="left" />


    <RelativeLayout
       android:layout_width="450dp"
       android:layout_height="match_parent"
       android:layout_weight="1"
       android:paddingLeft="16dp"
       android:paddingRight="16dp">


        <fragment
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:id="@+id/content_pane"
           android:name="com.example.nomedellatuaapp.nomeClasseFrg2"
           android:layout_above="@+id/llRiepilogoItemSel"
           android:layout_alignParentTop="true" />


        <LinearLayout
           android:id="@+id/llRiepilogoItemSel"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_alignParentBottom="true">


            <TextView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="Etichetta"/>


            <TextView
               android:id="@+id/tvNumItemSelected"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="NUM ITEM SEL"/>


        </LinearLayout>


    </RelativeLayout>


</android.support.v4.widget.SlidingPaneLayout>

Offline Peppin2o

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 8.1 Pro x64
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #8 il: 08 Gennaio 2014, 12:48:02 CET »
0
Si, ma per caratteristiche d'utilizzo dell'app (e del tablet) essa dovrà rimanere in portrait :) è per questo motivo che ho deciso di mettere la lista sotto lo sliding pane.

Ho visto una cosa simile realizzata per un vecchio palmare da 4 pollici e ti dico che era veramente ben fatta. Dovrei dare a questa lista poco spazio (diciamo al massimo 200 dpi in altezza) proprio perchè, essendo di riepilogo, viene solo letta e poche volte la si usa ;)

Comunque grazie :) ora sono in pausa pranzo. Nel pomeriggio torno a lavorarci. Se ho problemi seri ti chiederò aiuto (sempre che non ti dispiaccia e che ti vada di rispondermi :D)

Buon pranzo!

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #9 il: 08 Gennaio 2014, 17:27:49 CET »
0
Si, ma per caratteristiche d'utilizzo dell'app (e del tablet) essa dovrà rimanere in portrait :) è per questo motivo che ho deciso di mettere la lista sotto lo sliding pane.

Valuta di utilizzare un layout alternativo quando sei in landscape. Bloccare la rotazione è una pessima soluzione.

Offline Peppin2o

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 8.1 Pro x64
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #10 il: 08 Gennaio 2014, 18:09:55 CET »
0
Dal punto di vista del programmatore, sì, hai pienamente ragione.
Però per quello che è l'utilizzo vero e proprio dell'app, essa non andrà in landscape, semplicemente perché il tablet verrà utilizzato come un taccuino da tenere in una sola mano: ho delle dimensioni (del tablet) che mi permettono di farlo e di starci anche bene a livello visuale, per fortuna, altrimenti avrei dovuto implementare anche questo ;)

Comunque per ora il tutto funziona: ho implementato la lista nell'interfaccia grafica sotto lo slidePanel come mi ha suggerito crc_error (special thanks to you). Mi resta da gestirne tutte le modifiche :)

PS: se io volessi passare un oggetto (di una classe creata da me) da un'activity al fragment, modificarlo qui e ripassarlo all'activity, come dovrei fare? Sopratutto quest'ultimo passo (il ritorno dell'oggetto all'activity) non mi è molto chiaro. Mi potreste dare delucidazioni in merito?

Grazie ancora :))

« Ultima modifica: 08 Gennaio 2014, 18:12:54 CET da Peppin2o »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:[medio] Il nuovo SlidingPaneLayout
« Risposta #11 il: 08 Gennaio 2014, 20:18:11 CET »
0
Dal punto di vista del programmatore, sì, hai pienamente ragione.

No no... io parlavo da utente.
Non posso sopportare una app che non ruota con il mio tablet.
Il tablet è mio, ci lavoro come ritengo più opportuno. E se non posso, disinstallo.

Sull'altra domanda.
Puoi utilizzare dei callback.