Android SplashScreen

Я разрабатываю приложение, которое в основном загружает большое количество данных в начале самого приложения и отображает его в ListActivity. То, что я планирую сделать, это показать экран заставки до тех пор, пока данные не будут загружены.

До сих пор все мои попытки были бесполезны. Я пробовал использовать методы anddev.org, но моя проблема заключается в том, что основное действие должно начинаться, но экран Splash должен быть видимым до тех пор, пока я не заполню ListActivity. Короче говоря, я должен выполнить следующие шаги:

  • Начать мое основное действие.
  • Показать экран заставки.
  • Продолжайте работать в фоновом режиме.
  • Выйдите из заставки после завершения обработки и покажите основной список.

Надеюсь, вы поймете, что это такое....

Ответ 1

Вероятно, проблема заключается в том, что вы запускаете экран заставки (что-то вроде Dialog, например ProgressDialog Я предполагаю) в том же потоке, что и вся работа. Это позволит не обновлять представление о всплывающем экране, что может помешать ему даже отобразиться на экране. Вам нужно отобразить заставку, запустить экземпляр AsyncTask, чтобы загрузить все ваши данные, а затем скрыть заставку после выполнения задачи завершено.

Итак, ваш метод action onCreate() просто создаст ProgressDialog и покажет его. Затем создайте AsyncTask и запустите его. Я бы сделал AsyncTask внутренним классом вашего основного действия, чтобы он мог хранить данные, которые он загрузил, в какую-либо переменную в вашей Деятельности и закрыть ProgressDialog в методе onPostExecute().

Не знаю, как это сделать, просто не показывая код, так вот:

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

Очевидно, есть некоторые фрагменты, которые вам нужно заполнить, но этот код должен запускаться и давать вам хорошую отправную точку (прошу меня, если есть ошибка кода, у меня нет доступа к Android SDK, m введите это сейчас).

Более хорошее чтение по теме AsyncTasks на Android можно найти здесь и .

Ответ 2

только для справки, это лучший способ заставить заставку: http://android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html

Я искал это довольно долго, из андроидов docs.. Если вы хотите избежать этих черных экранов, вам нужно создать тему с помощью windowBackground, чтобы:

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

И установите эту тему в качестве темы для вашей основной деятельности... TADA, заставка с первой секунды.

Если вам нужен сложный фон, а не только изображение, которое будет растянуто для заполнения, вы можете использовать Drawables, вот пример списка слоев, который сохранит логотип с центром на черном фоне:

<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>

Ответ 3

  • Начать мое основное действие.
  • Показать экран заставки.
  • Продолжайте работать в фоновом режиме.
  • Выйдите из заставки после завершения обработки и покажите основной список.

Я пробовал этот путь, но проблема в этом; он покажет основную активность перед запуском активности заставки.

Я сделал это так:

  • Запустите экран заставки
  • Когда процесс завершается, запустите "основное действие"
  • Не забывайте обращаться с кнопкой "Назад", поэтому закрыть приложение будет нажато в основном действии. В противном случае вернется к экрану заставки (цикл)

Моя проблема заключается в том, как отключить "показать меню действия экрана заставки", нажав кнопку меню.

Edit:

Отключить меню показа:

@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;
}

Ответ 4

Пример экрана заставки:

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

    }

}