Окно загрузки в Android

Рейтинг: 1Ответов: 1Опубликовано: 09.04.2015

Подскажите, как сделать окно с сообщением о загрузке программы.

Написал в onCreate следующий код:

    imageViewLoading = new ImageView(this);
    rlayout.addView(imageViewLoading);
    Bitmap bitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888);

    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint();
    paint.setFlags(Paint.ANTI_ALIAS_FLAG);

    paint.setTextSize(60);
    paint.setColor(Color.BLUE);
    canvas.drawText("Loading...", 10, 20, paint);

    imageViewLoading.setImageBitmap(bitmap);

    GetData();
    rlayout.removeView(imageViewLoading);

В результате на экране пусто. Как отображать надпись "Loading...", что я делаю не так? Вызов GetData() довольно продолжительный, требуется показывать сообщение, пока он не завершится.

Ответы

▲ 4

Смотря чего ты хочешь добиться. Ты хочешь просто стартовый экран, где будет, скажем, логотип приложения и какой-нибудь индикатор загрузки? Или же ты хочешь создать диалоговое окошко, где будет текст и индикатор?

UPD: Создаешь новое Activity. Скажем, SplashScreenActivity.

public class SplashScreenActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_screen_layout);
        //Здесь ты в асинхронном потоке делаешь какую-то логику. Почитай про asyncTask
        SplashScreenAsyncTask splashScreenAsyncTask = new SplashScreenAsyncTask(this);
        splashScreenAsyncTask.execute();
    }
}

Твой splash_screen_layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFF"
    tools:context=".SplashScreenActivity">
    <ImageView
        android:layout_width="150dp"
        android:layout_height="150dp"
        // картиночка твоя
        android:src="@drawable/ic_launcher_web"
        android:contentDescription="mainLogo"
        android:layout_centerInParent="true" />
    // Здесь какой-то индикатор загрузки. Почитай про progressBar
     <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@android:style/Widget.ProgressBar.Small"/>
</RelativeLayout>

Не забудь добавить в манифест такие строчки:

    <activity
        android:name=".SplashScreenActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Вот еще пример asyncTask'a, который просто 4 секунды ждет, а затем запускает основное Activity:

public class SplashScreenAsyncTask extends AsyncTask<Void, Void, Void> {

    SplashScreenActivity splashActivity;

    SplashScreenAsyncTask(SplashScreenActivity activity)
    {
        this.splashActivity = activity;
    }

    @Override
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent myIntent = new Intent(splashActivity, MainActivity.class);
                runActivity.startActivity(myIntent);
                runActivity.finish();
            }
        }, 4000); // TODO: CHANGE WAITING TIME OR PUT SOME LOGIC
    }
}

Логику, естественно, нужно класть в doInBackground. Твой getData(), я думаю, как раз там и должен находиться. А в onPostExeceute (который запускается сразу, как только doInBackground закончится) уже стартовать главное активити приложения через Intent. Почитай про AsyncTask, короче:)