Android: заставка не отображается, почему? - PullRequest
5 голосов
/ 10 июня 2011

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

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class Ext3 extends Activity {

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

        Log.v("Ext3", "starting to sleep");

        try {
            Thread.sleep (5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Log.v("Ext3", "done sleeping");

        setContentView (R.layout.main);
    }

}

Ответы [ 4 ]

7 голосов
/ 10 июня 2011

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

Вместо Thread.sleep,Я бы посоветовал вам взглянуть на Таймер или что-то подобное, чтобы запланировать обновление и изменение содержимого вашего представления;альтернативой может быть запуск AsyncTask , где вы могли бы спать перед тем, как менять представление, как вы делаете сейчас.

Не спать или каким-либо другим способом блокировать поток пользовательского интерфейса, это плохо... (вызывает ANR)

1 голос
/ 11 июня 2011

Я пробовал этот код в своем приложении, и он отлично работает. Может быть, он вам поможет.

public class SplashScreen extends Activity {

    /**
     * The thread to process splash screen events
     */
    private Thread mSplashThread;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Splash screen view
        setContentView(R.layout.splash);



        final SplashScreen sPlashScreen = this;

        // The thread to wait for splash screen events
        mSplashThread = new Thread() {
            @Override
            public void run() {
                try {
                    synchronized (this) {
                        // Wait given period of time or exit on touch
                        wait(5000);
                    }
                } catch (InterruptedException ex) {
                }

                finish();

                // Run next activity
                Intent intent = new Intent();
                intent.setClass(sPlashScreen, MainActivity.class);
                startActivity(intent);
                stop();
            }
        };

        mSplashThread.start();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        return false;
    }

    /**
     * Processes splash screen touch events
     */
    @Override
    public boolean onTouchEvent(MotionEvent evt) {
        if (evt.getAction() == MotionEvent.ACTION_DOWN) {
            synchronized (mSplashThread) {
                mSplashThread.notifyAll();
            }
        }
        return true;
    }

}
1 голос
/ 10 июня 2011

Когда вы вызываете sleep таким образом, вы блокируете поток пользовательского интерфейса. Вместо этого поместите второй вызов setContentView в Runnable, создайте обработчик и используйте метод обработчика postDelayed для запуска Runnable. Как то так:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    Runnable endSplash = new Runnable() {
        @Override
        public void run() {
            setContentView (R.layout.main);
        }
    }
    new Handler().postDelayed(endSplash, 5000L);
}
0 голосов
/ 16 июня 2011

Это фрагмент базового заставки

public class Splash extends Activity {

//private ProgressDialog pd = null;
private final int SPLASH_DISPLAY_LENGTH = 3000; 

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.splashscreen);
    //this.pd = ProgressDialog.show(this, "Initializing..", "Initializing Infraline...", true, false);

    /* New Handler to start the InfralineTabWidget-Activity
     * and close this Splash-Screen after some seconds.*/

    new Handler().postDelayed(new Runnable(){
        @Override
        public void run() {
        /* Create an Intent that will start the InfralineTabWidget-Activity. */
            Intent mainIntent = new Intent(Splash.this,InfralineTabWidget.class);
            Splash.this.startActivity(mainIntent);
            Splash.this.finish();
        }
    }, SPLASH_DISPLAY_LENGTH);

}

}

А в вашем AndroidManifest.xml поместите

    <activity android:name=".Splash" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="orientation|keyboardHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Надеюсь, это сработает для вас:)

...