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