risposta-alla-domanda-sullo-sviluppo-web-bd.com

Android Schermata iniziale

Sto sviluppando un'applicazione che sostanzialmente scarica molti dati all'inizio dell'applicazione stessa e li visualizza in ListActivity. Quello che sto pensando di fare è mostrare una schermata iniziale fino a quando i dati non vengono caricati.

Fino ad ora tutti i miei tentativi sono stati inutili. Ho provato i metodi menzionati da anddev.org, ma il mio problema è che l'attività principale dovrebbe iniziare ma la schermata iniziale dovrebbe essere visibile fino a quando non popolerò il mio elenco attività. Quindi in breve devo seguire i seguenti passi:

  1. Inizia la mia attività principale.
  2. Mostra la schermata iniziale.
  3. Continua a eseguire il processo in background.
  4. Esci dalla schermata iniziale quando l'elaborazione è stata completata e mostra l'elenco principale.

Spero che tu capisca com'è ...

80
JaVadid

È molto probabile che il problema stia eseguendo la schermata iniziale (una sorta di finestra di dialogo come ProgressDialog presumo) nello stesso thread di tutto il lavoro svolto. Ciò impedirà l'aggiornamento della vista della schermata iniziale, che può impedirne persino la visualizzazione sullo schermo. È necessario visualizzare la schermata iniziale, dare il via a un'istanza di AsyncTask per andare a scaricare tutti i dati, quindi nascondere la schermata iniziale una volta completata l'attività.

Quindi il metodo onCreate () della tua attività creerebbe semplicemente un ProgressDialog e lo mostrerebbe. Quindi creare l'AsyncTask e avviarlo. Vorrei rendere AsyncTask una classe interna della tua attività principale, in modo che possa archiviare i dati che ha scaricato in qualche variabile nella tua attività e chiudere ProgressDialog nel suo metodo onPostExecute ().

Non sei sicuro di come elaborare più senza solo mostrare il codice, quindi eccolo qui:

public class MyActivity extends Activity {
    private ProgressDialog pd = null;
    private Object data = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Show the ProgressDialog on this thread
        this.pd = ProgressDialog.show(this, "Working..", "Downloading Data...", true, false);

        // Start a new thread that will download all the data
        new DownloadTask().execute("Any parameters my download task needs here");
    }

    private class DownloadTask extends AsyncTask<String, Void, Object> {
         protected Object doInBackground(String... args) {
             Log.i("MyApp", "Background thread starting");

             // This is where you would do all the work of downloading your data

             return "replace this with your data object";
         }

         protected void onPostExecute(Object result) {
             // Pass the result data back to the main activity
             MyActivity.this.data = result;

             if (MyActivity.this.pd != null) {
                 MyActivity.this.pd.dismiss();
             }
         }
    }    
}

Ovviamente ci sono alcuni pezzi che devi compilare lì, ma questo codice dovrebbe essere eseguito e darti un buon punto di partenza (perdonami se c'è un errore di codice, non ho accesso all'SDK Android come ho sto scrivendo questo attualmente).

Altre buone letture sull'argomento AsyncTasks in Android sono disponibili qui e qui .

89
Mark B

solo per riferimento questo è il modo migliore che ho trovato per creare una schermata iniziale: http://Android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html

Lo stavo cercando da un po 'di tempo, dai documenti androidi .. se vuoi evitare quelle schermate nere, devi creare un tema con windowBackground così:

<resources>
    <style name="Theme.Shelves" parent="Android:Theme">
        <item name="Android:windowBackground">@drawable/background_shelf</item>
        <item name="Android:windowNoTitle">true</item>
    </style>
</resources>

E imposta questo tema come tema per la tua attività principale ... TADA, schermata iniziale dal primo secondo.

Se vuoi uno sfondo complesso e non solo un'immagine che verrà allungata per riempire, puoi usare Drawables, ecco un esempio di un elenco di livelli che manterrà il logo centrato su uno sfondo nero:

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <item Android:drawable="@color/black">
    </item>
    <item>
        <bitmap
            Android:gravity="center"
            Android:src="@drawable/logo"
            Android:tileMode="disabled" >
        </bitmap>
    </item>
</layer-list>
59
Raanan

Esempio di schermata iniziale:

public class MainActivity extends Activity {
    private ImageView splashImageView;
    boolean splashloading = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        splashImageView = new ImageView(this);
        splashImageView.setScaleType(ScaleType.FIT_XY);
        splashImageView.setImageResource(R.drawable.ic_launcher);
        setContentView(splashImageView);
        splashloading = true;
        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            public void run() {
                splashloading = false;
                setContentView(R.layout.activity_main);
            }

        }, 3000);

    }

}
1
kablu
  1. Inizia la mia attività principale.
  2. Mostra la schermata iniziale.
  3. Continua a eseguire il processo in background.
  4. Esci dalla schermata iniziale quando l'elaborazione è stata completata e mostra l'elenco principale.

Ho provato in questo modo, ma il problema è; mostrerà l'attività principale prima di iniziare l'attività della schermata iniziale.

L'ho fatto in questo modo:

  1. Avvia la schermata iniziale
  2. Al termine del processo, avviare "attività principale"
  3. Non dimenticare di gestire il pulsante Indietro, quindi dovrebbe chiudere l'applicazione verrà premuta nell'attività principale. Altrimenti tornerà alla schermata iniziale (loop)

Il mio problema è come disabilitare "mostra il menu dell'attività della schermata iniziale" premendo il pulsante menu.

Edit:

Disabilita il menu Mostra:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // getMenuInflater().inflate(R.menu.activity_main, menu);
    return false;
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {       
    // return super.onMenuItemSelected(featureId, item);
    return false;
}
1
Gabe