Autore Topic: Creare layout programmaticamente mostrando ProgressDialog  (Letto 487 volte)

Offline vavabigol

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire - CM 7.2.0.1
  • Sistema operativo:
    Ubuntu 11.10 - Windows 7
Creare layout programmaticamente mostrando ProgressDialog
« il: 22 Luglio 2011, 12:44:27 CEST »
0
Ciao a tutti!
Ho la necessità di creare parte del mio layout programmaticamente. Il problema è che spesso le cose da creare sono molte e l'activity ci mette un paio di secondi prima di comparire; questa cosa mi infastidisce perché all'utente verrebbe ovviamente naturale ritoccare lo schermo pensando che non stia succedendo nulla.
La soluzione sarebbe mostrare un ProgressDialog nell'attesa che la creazione del layout abbia fine, ma quello che ho provato fino ad ora (Handler, AsynkTask) non funziona..

qualcuno può darmi qualche suggerimento su come fare?

grazie!!  :-)

Offline liuk78

  • Utente junior
  • **
  • Post: 73
  • Respect: +5
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Creare layout programmaticamente mostrando ProgressDialog
« Risposta #1 il: 22 Luglio 2011, 12:55:34 CEST »
0
A me cosi funziona perfettamente, sempre se ho capito cosa ti serve  :D :D :D
Se non ti dovesse funziore posta il tuo codice e logcat.  ;-)

Codice: [Seleziona]

//Lo dichiaro come variabile di classe

ProgressDialog progressDialog = null;       

//Lo inizializzo al click dell'utente, nel mio caso un semplice submit

public void onClick(View v)
{
        progressDialog = ProgressDialog.show(TuaActivity.this,
              getResources().getString(R.string.progressDialogTitle),
              getResources().getString(R.string.progressDialogDescription),
                              true);       
                       
...................................

}         


//Lo uccido alla fine dell'elaborazione dell'handler


        private Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                        try
                        {
                                                          ...............................
                        }
                        catch (Exception e)
                        {
                                ...............................
                        }
                        finally
                        {
                                if (progressDialog!= null) progressDialog.dismiss();
                        }
                }
        };             


Offline vavabigol

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire - CM 7.2.0.1
  • Sistema operativo:
    Ubuntu 11.10 - Windows 7
Re:Creare layout programmaticamente mostrando ProgressDialog
« Risposta #2 il: 22 Luglio 2011, 15:19:54 CEST »
0
Tanto per cominciare grazie per la risposta  :D

Questo è praticamente il codice che ho provato anche io.. ma senza successo!  :'(
Credo che il mio problema sia che inizio la creazione del layout nella onCreate(...).. e lo completo nella onWindowFocusChanged(...) , dato che ho bisogno degli effettivi pixel che le view trattate nella onCreate(...) assumono a video (per inserire in scala altre View) ; visualizzando il Dialog temo però che la onWindowFocusChanges(...) non venga chiamata fino a quando richiamo il "dismiss" ... e lo deduco perchè mettendo un breakpoint questo non viene mai raggiunto.. ;)

Suggerimenti?

Offline liuk78

  • Utente junior
  • **
  • Post: 73
  • Respect: +5
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Creare layout programmaticamente mostrando ProgressDialog
« Risposta #3 il: 22 Luglio 2011, 15:22:49 CEST »
0
guarda messa cosi non è che ci abbia capito molto  :-[
se vuoi provare a postare il codice magari gli do uno sguardo altrimenti devi aspettare qualcuno più esperto!  :-P

Offline vavabigol

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire - CM 7.2.0.1
  • Sistema operativo:
    Ubuntu 11.10 - Windows 7
Re:Creare layout programmaticamente mostrando ProgressDialog
« Risposta #4 il: 22 Luglio 2011, 16:05:42 CEST »
0
Allora.. ci provo  :D

Questo è il mio layout xml ( un po' ripulito.. ma quello che ci interessa c'è)

Codice (Java): [Seleziona]
<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/room_frameLayout">
        <LinearLayout    
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:id="@+id/room_layout"
          android:orientation="vertical">
          <it.milesi.scroller.Workspace
                android:id="@+id/scroller"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1">
          </it.milesi.scroller.Workspace>                
        <SlidingDrawer
                android:id="@+id/slidingDrawer_Operations"
                android:content="@+id/content"
                android:layout_height="match_parent"
                android:handle="@+id/handle"
                android:layout_width="match_parent">
                <ImageView
                        android:id="@+id/handle"
                        android:layout_height="wrap_content"
                        android:layout_width="match_parent">                   
                </ImageView>
                <LinearLayout
                        android:id="@+id/content"
                        android:layout_height="match_parent"
                        android:orientation="vertical"
                        android:background="@color/white"
                        android:layout_width="match_parent">
                        <ExpandableListView
                                android:layout_width="match_parent"
                                android:id="@+id/expandableListView_Operations"
                                android:layout_height="match_parent">
                        </ExpandableListView>
                </LinearLayout>
        </SlidingDrawer>
</FrameLayout>

In sostanza io posso cambiare l'immagine dello SlidingDrawer.. anche con immagini caricate da SD.. per cui non posso sapere la loro esatta grandezza a priori.
Alla fine io dovrei avere "room_linearlayout" che oppupa tutto lo schermo "meno" la parte finale.. corrispondente all'altezza dell'handle dello slidingDrawer.

Workspace è la classe che mamma google utilizza per gestire gli schermi nella home di android (ovviamente modificata come serve a me).
Nella onCreate(...) non faccio altro che interrogare il database per recuperare il numero di View ( da inserire come child di Workspace.

Codice (Java): [Seleziona]
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.room_v3);
   
    Screen[] myScreen = null;
    myScreen = db.getScreen(roomId);  // dal database recupero, tramite un id, le view da inserire nello Workspace con i relativi dati
                                                             // riguardanti le misure che dovranno avere
   
    // myScreen è un'estensione di RelativeLayout

   isDrawing = true;   // variabile globale che mi segnala che non ho ancora completato il layout
}

A questo punto.. per sapere quali dimensioni esatte (in pixel) ha assunto l'handle dello SlidingDrawer devo attendere che venga richiamato onWindowFocusChanged(boolean hasFocus) .. di cui ho fatto l'override:

Codice (Java): [Seleziona]
public void onWindowFocusChanged(boolean hasFocus){

                if(isDrawing){
                     Rect r = new Rect();
               
                     LinearLayout room_layout = (LinearLayout)findViewById(R.id.room_layout);          
                     LinearLayout handle = (LinearLayout)findViewById(R.id.handle);            
                     room_layout.getWindowVisibleDisplayFrame(r);
               
                     int appHeight = room_layout.getHeight() - handle.getHeight();
                     int appWidth = room_layout.getWidth();

                    // Con appHeight e appWidth io inserisco in scala le View da visualizzare per ogni figlio di Workspace..

                    isDrawing = false;
         }
}


Il problema è che in onWindowFocusChanged(...) se mostro il ProgressDialog non ci arrivo più ...

Non so se sono stato molto chiaro nello spiegare il problema.. spero di si ;)
Grazie  :D
« Ultima modifica: 22 Luglio 2011, 16:12:47 CEST da vavabigol »

Offline vavabigol

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire - CM 7.2.0.1
  • Sistema operativo:
    Ubuntu 11.10 - Windows 7
Re:Creare layout programmaticamente mostrando ProgressDialog
« Risposta #5 il: 25 Luglio 2011, 11:10:43 CEST »
0
Ho provato un paio di soluzioni ma non ho ancora risolto il problema..  :-(

C'è nessuno che ha idea di come posso fare?
Grazie mille..  :-)
« Ultima modifica: 26 Luglio 2011, 12:19:19 CEST da vavabigol »