Android SplashScreen

Rozwijam aplikację, która w zasadzie pobiera dużo danych na początku samej aplikacji i wyświetla je na liście. Planuję pokazać ekran powitalny, aż dane zostaną załadowane.

Do tej pory wszystkie moje próby były daremne. Próbowałem anddev.org wymienione metody, ale mój problem polega na tym, że główna aktywność powinna się rozpocząć, ale ekran powitalny powinien być widoczny, dopóki nie wypełnię mojej listy. Więc w skrócie muszę przejść przez następujące kroki:

    Rozpocznij moją główną działalność.
  1. Pokaż ekran powitalny.
  2. Kontynuuj uruchamianie procesu w tle.
  3. Wyjdź z ekranu rozpryskowego po zakończeniu przetwarzania i pokaż listę główną.

Mam nadzieję, że rozumiesz, jak to jest....

Author: aligf, 2009-12-30

4 answers

Problem polega najprawdopodobniej na tym, że uruchamiasz ekran powitalny (jakieś okno dialogowe , takie jak ProgressDialog zakładam) w tym samym wątku, co cała wykonywana praca. Spowoduje to, że widok ekranu powitalnego nie zostanie zaktualizowany, co może uniemożliwić wyświetlenie go na ekranie. Musisz wyświetlić ekran powitalny, uruchomić instancję AsyncTask , Aby pobrać wszystkie dane, a następnie ukryć ekran powitalny, gdy zadanie jest kompletna.

Więc twoja metoda OnCreate () po prostu utworzy ProgressDialog i pokaże go. Następnie utwórz AsyncTask i uruchom go. Uczyniłbym AsyncTask wewnętrzną klasą Twojej głównej aktywności, aby mogła przechowywać dane, które pobrał do jakiejś zmiennej w Twojej aktywności i zamknąć ProgressDialog w swojej metodzie onPostExecute ().

Nie wiem już, jak rozwinąć, nie pokazując tylko kodu, więc oto jest:

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();
             }
         }
    }    
}

Oczywiście są pewne kawałki, które trzeba tam wypełnić, ale ten kod powinien działać i dać dobry punkt wyjścia(wybacz mi, jeśli jest błąd kodu, nie mam dostępu do Android SDK, jak piszę to obecnie).

Więcej dobrych lektur na temat AsyncTasks w Androidzie można znaleźć tutaj i tutaj .

 89
Author: Mark B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-14 00:15:40

Tylko dla odniesienia jest to najlepszy sposób, jaki znalazłem, aby zrobić ekran powitalny: http://android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html

Szukałam tego przez jakiś czas, od androids docs.. jeśli chcesz uniknąć tych czarnych ekranów, musisz utworzyć motyw z windowBackground Tak:
<resources>
    <style name="Theme.Shelves" parent="android:Theme">
        <item name="android:windowBackground">@drawable/background_shelf</item>
        <item name="android:windowNoTitle">true</item>
    </style>
</resources>

I ustaw ten motyw jako motyw dla swojej głównej aktywności... TADA, splashscreen od pierwszej sekundy.

Jeśli chcesz kompleks tło, a nie tylko obraz, który zostanie rozciągnięty do wypełnienia, możesz użyć rysunków, oto przykład listy warstw, która utrzyma logo wyśrodkowane na czarnym tle: {]}

<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
Author: Raanan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-23 14:46:37

Przykład ekranu powitalnego:

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
Author: kablu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 07:10:21
    Rozpocznij moją główną działalność.
  1. Pokaż ekran powitalny.
  2. Uruchom proces w tle.
  3. Wyjdź z ekranu rozpryskowego po zakończeniu przetwarzania i pokaż listę główną.

Próbowałem w ten sposób, ale problem polega na tym, że wyświetli główną aktywność przed rozpoczęciem aktywności ekranu powitalnego.

Zrobiłem to w ten sposób:

  1. Uruchom ekran powitalny
  2. gdy proces zostanie zakończony, Uruchom " main aktywność "
  3. nie zapomnij obsłużyć przycisk wstecz, więc powinien zamknąć aplikację ist zostanie naciśnięty w głównej aktywności. W przeciwnym razie powróci do ekranu powitalnego (pętla)

Mój Problem polega na tym, jak wyłączyć "Pokaż Menu aktywności ekranu powitalnego", naciskając przycisk menu.

Edit:

Wyłącz menu Pokaż:

@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
Author: Gabe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-24 04:28:24