2014-02-20 4 views
6

В настоящее время я предоставляю 2 темы в своем приложении, основываясь на последнем выборе пользователя - темной теме и легкой теме.Самый быстрый способ изменить тему во время запуска приложения

Во время запуска основной деятельности я сделаю следующее.

public class MyFragmentActivity extends FragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // getUserLastThemeChoice will either return R.style.Theme_My_Light or 
     // R.style.Theme_My_Dark. 
     this.setTheme(getUserLastThemeChoice()); 

     super.onCreate(savedInstanceState); 

В моей AndroidManifest.xml я следующее

<application 
    ... 
    android:theme="@style/Theme.My.Dark" > 

В связи с жестко заданным значением в AndroidManifest.xml, если пользователь предыдущий выбор свет тема, я наблюдал следующее.

  1. App начать с темной темой, из-за AndroidManifest.xml
  2. времени ...
  3. App изменится на белую тему из-за this.setTheme в главном Activity

там никак может избежать такого наблюдения перехода? Вот и все, просто представляйте пользователю напрямую, основываясь на их последнем выборе.

p/s Примечание. Это не поможет, если вы удалите информацию о теме из манифеста. Поскольку по умолчанию система будет использовать голограмму темную. Вы по-прежнему будете наблюдать переход, особенно в медленном устройстве.

+0

Что произойдет, если вы удалите назначение темы в манифесте? –

+0

Вы по-прежнему наблюдаете переход. Поскольку система будет использовать голограмму по умолчанию. –

+0

Хммм ... так что вам нужно что-то увидеть.И если вы попробуете нейтральную тему, чтобы показать, скажем, Splash Screen, а затем применить свою тему и запустить основное приложение? Может быть, идея? –

ответ

1

Скрыть манипуляции с темой, особенно при запуске приложения, сложно. К сожалению, нет никакого способа последовательно удалить этот начальный переход, потому что не известно, насколько быстро/медленнее работает его устройство. Android всегда будет показывать этот пустой фон в теме по умолчанию, прежде чем раздувать макет для основного действия.

Но есть трюк, чтобы спрятать его. Заставка, которая появляется, когда пользователь открывает приложение, и исчезает после загрузки начальной активности. Таким образом, экран заставки скрывает переход к теме, не раздражая пользователя. Всплывающие экраны получают некоторую заслуженную ненависть, но такая ситуация оправдывает их использование. Опять же, я не знаю специфику вашего приложения, но вы должны взвесить плюсы и минусы наличия заставки и плавного перехода, без всплеска экрана и резкого перехода.

Существует множество способов реализации заставки. В вашем случае я бы попытаться создать пусковую деятельность, с нейтральной темой, и применить плавную анимацию для перехода между заставкой и вашей основной деятельностью, как так:

startActivity(new Intent(LauncherActivity.this, MainActivity.class)); 
overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 

И анимации:

<!-- fadeout --> 
<?xml version="1.0" encoding="UTF-8"?> 
<alpha xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/accelerate_interpolator" 
android:fromAlpha="1.0" android:toAlpha="0.0" 
android:duration="300" /> 

<!-- fadein --> 
<?xml version="1.0" encoding="utf-8"?> 
<alpha xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/accelerate_interpolator" 
android:fromAlpha="0.0" android:toAlpha="1.0" 
android:duration="300" /> 
+0

Хорошая идея. Но я предпочитаю не иметь заставки. –

0

Я знаю, что это очень старый, но, может быть, он по-прежнему помогает:

Если вы определили тему своей деятельности на

android:theme="@android:style/Theme.Translucent.NoTitleBar" 

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

Смежные вопросы