Potrzebuję ekran powitalny dla mojej aplikacji. Próbowałem utworzyć działanie mające obraz dla mojego ekranu powitalnego; i próbował użyć pętli for i klasy Timer do wprowadzenia opóźnienia czasowego. Ale to nie działa w ten sposób. Czy robię to źle; jeśli tak, jaka jest właściwa droga?Najlepszy sposób na ekran powitalny w aplikacji na Androida?
Odpowiedz
Powyższe rozwiązania są dobre, ale co zrobić, jeśli użytkownik naciśnie klawisz back (i zamknie twoją aplikację), zanim opóźnienie powitania się skończy. Aplikacja prawdopodobnie nadal będzie otwierać następne działanie, które nie jest tak naprawdę przyjazne dla użytkownika.
Dlatego pracuję z niestandardowym Handler i usuwam wszystkie oczekujące wiadomości w onDestroy().
public class SplashActivity extends Activity
{
private final static int MSG_CONTINUE = 1234;
private final static long DELAY = 2000;
@Override
protected void onCreate(Bundle args)
{
super.onCreate(args);
setContentView(R.layout.activity_splash);
mHandler.sendEmptyMessageDelayed(MSG_CONTINUE, DELAY);
}
@Override
protected void onDestroy()
{
mHandler.removeMessages(MSG_CONTINUE);
super.onDestroy();
}
private void _continue()
{
startActivity(new Intent(this, SomeOtherActivity.class));
finish();
}
private final Handler mHandler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
switch(msg.what){
case MSG_CONTINUE:
_continue();
break;
}
}
};
}
Myślę, że onPause jest lepszym rozwiązaniem dla wywołania removeMessages(). Odkryłem, że onDestroy jest nazywany zbyt późno w cyklu życia, a kolejna aktywność pojawia się po kliknięciu. +1 jednak :-) – barry
Możesz po prostu odłożyć?
Thread delay = new Thread() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
runOnUiThread(new Runnable() {
@Override
public void run() {
startNextActivity();
}
});
}
};
Spróbuj
public class SplashActivity extends Activity {
Handler handler;
private long timeDelay = 2000; //2 seconds
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.SplashLayout);
final Intent i = new Intent(this, Landing.class);
handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
startActivity(i);
finish();
}
}, timeDelay);
}
}
Spróbuj tego,
protected int _splashTime = 15000;
private Handler handler;
private Runnable runnable;
private Context context;
@Override
public void onCreate(Bundle savedInstance)
{
super.onCreate(savedInstance);
setContentView(R.layout.splash);
final SplashScreen sPlashScreen = this;
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
try {
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, _splashTime);
}
finally {
finish();
//start a new activity
//mtdCheckLicense();
Intent main = new Intent();
main.setClass(sPlashScreen, YourMainActivity.class);
startActivity(main);
handler.removeCallbacks(runnable);
}
}
};
handler.postDelayed(runnable, 2000);
}
będzie przelewać na jakiś czas i uruchomić główną działalność. W tym kodzie ekran powitalny czeka 2Seconds, a następnie uruchamia główną aktywność.
Najprościej zrobić za każdym moim projekcie to wygląda następująco:
public class SplashActivity extends Activity {
protected boolean active = true;
protected int splashTime = 1000;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_screen);
Thread splashTread = new Thread() {
@Override
public void run() {
try {
int waited = 0;
while(active && (waited < splashTime)) {
sleep(100);
if(active) {
waited += 100;
}
}
} catch(InterruptedException e) {
// do nothing
} finally {
finish();
// Start your Activity here
}
}
};
splashTread.start();
}
//...
z rozwiązaniami opisanymi tu marnujesz czas, ponieważ wstrzymać inicjalizacji dla 2-3seconds zanim kontynuować .
Wolę dodawać Splash Screen Layout
na wierzch mojego main_activity.xml
. Wykrywam pierwsze uruchomienie aplikacji przez rozszerzenie aplikacji. Jeśli its pierwszy start, pokażę mój ekran powitalny podczas gdy UI jest budować w tle ... (użyj wątki tło Jeśli ProgressBar tyle!)
//Extend Application to save the value. You could also use getter/setter for this instead of Shared Preferences...
public class YourApplication extends Application {
public static final String YOUR_APP_STARTUP = "APP_FIRST_START";
@Override
public void onCreate() {
super.onCreate();
//set SharedPreference value to true
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = mPreferences.edit();
editor.putBoolean(YOUR_APP_STARTUP, true);
editor.apply();
...
}
Sprawdzić swoim pierwszym starcie w twojej MainActivity
public class YourMainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//hide actionbar and other menu which could overlay the splash screen
getActionBar().hide();
setContentView(R.layout.activity_main);
Boolean firstStart = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(TVApplication.YOUR_APP_STARTUP, true);
if (firstStart) {
//First app start, show splash screen an hide it after 5000ms
final RelativeLayout mSplashScreen = (RelativeLayout) findViewById(R.id.splash_screen);
mSplashScreen.setVisibility(View.VISIBLE);
mSplashScreen.setAlpha(1.0f);
final FrameLayout mFrame = (FrameLayout) findViewById(R.id.frame_container);
mFrame.setAlpha(0.0f);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Animation fadeOutAnimation = AnimationUtils.loadAnimation(getApplicationContext(),
R.anim.fade_out_animation);
fadeOutAnimation.setDuration(500);
fadeOutAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
mFrame.setAlpha(1.0f);
getActionBar().show();
}
@Override
public void onAnimationEnd(Animation animation) {
mSplashScreen.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mSplashScreen.startAnimation(fadeOutAnimation);
}
}, 5000); //<-- time of Splash Screen shown
} else {
((RelativeLayout) findViewById(R.id.splash_screen)).setVisibility(View.GONE);
getActionBar().show();
}
Umieść ekran powitalny w pliku main.xml. Dla tego wolę RelativeLayout
. W tym przykładzie SplashScreen jest umieszczony na układzie z Navitgation Drawer
, który naprawdę kochamy, prawda?
//main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- The main content view -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer list -->
<ListView
android:id="@+id/slider_list"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_gravity="start"
android:background="@color/tvtv_background"
android:choiceMode="singleChoice"
android:divider="@drawable/nav_bar_divider"
android:dividerHeight="1dp"
android:listSelector="@android:color/transparent" />
</android.support.v4.widget.DrawerLayout>
<RelativeLayout
android:id="@+id/splash_screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:background="@color/tvtv_white"
android:visibility="visible" >
<ImageView
android:id="@+id/splash_screen_logo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:paddingLeft="50dp"
android:paddingRight="50dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/splash_screen_text"
style="@style/TVTextBlueContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/splash_screen_logo"
android:layout_centerHorizontal="true"
android:padding="10dp"
android:text="Awesome splash shiat" />
<ProgressBar
android:id="@+id/splash_screen_loader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/splash_screen_text"
android:layout_centerHorizontal="true"
android:clickable="false"
android:indeterminate="true" />
</RelativeLayout>
</RelativeLayout>
To oznacza, że twój ekran powitalny zawsze będzie w hierarchii widoku, nawet jeśli go nie używasz. Jeśli chcesz użyć tego podejścia, lepiej użyj do tego 'ViewStub'. http://developer.android.com/reference/android/view/ViewStub.html – Jelle
- 1. Worklight App Ekran powitalny na Androida
- 2. Animowane Ekran powitalny na aplikacji Netbeans Platform
- 3. Ekran startowy iOS7 (ekran powitalny) pozostawia spację na dole
- 4. Animowany ekran powitalny z Phonegapem
- 5. Android Ekran powitalny
- 6. Android: "Ekran powitalny" tylko raz
- 7. Ekran powitalny dla uniwersalnych aplikacji Windows 10
- 8. Animowany ekran powitalny iOS
- 9. Usuń ekran powitalny w phonegap dla ios i Androida
- 10. Cordova ekran powitalny zmiana koloru tarczy na Androidzie
- 11. Ekran powitalny zmienia rozmiar nieprawidłowo
- 12. Jak ustawić ekran powitalny dla reagującego natywnego Androida?
- 13. [Ekran powitalny] Jak wyświetlić obraz na pełnym ekranie?
- 14. Jak utworzyć ekran powitalny jako preloader w samodzielnej aplikacji JavaFX?
- 15. UIStatusBar zmienia kolor na biały, gdy ekran powitalny pokazuje
- 16. Najlepszy sposób na wersję aplikacji szyn?
- 17. Jak wyświetlać ekran powitalny przez 3 sekundy na Androidzie?
- 18. Najlepszy sposób na tworzenie aplikacji wieloplatformowych?
- 19. Jak dostosować ekran powitalny w Emacs
- 20. Najlepszy sposób na stworzenie prostej aplikacji do czatowania filmów na Androida i iOS
- 21. Swing ekran powitalny z paska postępu
- 22. Android, najlepszy sposób na zapewnienie stałych aplikacji w projekcie bibliotecznym?
- 23. Najlepszy sposób na dystrybucję mojej aplikacji na iOS do testerów?
- 24. Najlepszy sposób na buforowanie json
- 25. jquery mobilny ekran powitalny z javascript
- 26. Ekran powitalny Durandal podczas pracy z obietnicami
- 27. Właściwy sposób na zapewnienie aktualizacji Premium bezpłatnej aplikacji na Androida
- 28. Czy jest jakiś sposób, aby pokazać ekran powitalny dla aplikacji WPF?
- 29. Wdrażanie aplikacji na Androida
- 30. Usunięcie paska powiadomień w aplikacji na Androida
Co konkretnie nie działało na czasomierza? To podejście powinno działać. Czy możesz wkleić swój kod? –
możliwy duplikat http://stackoverflow.com/questions/8642730/splash-screen-in-android-application –
Powinieneś zamieścić odpowiedź, jeśli różni się ona od drugiego pytania, lub usuń post, jeśli jest taki sam. – Sababado