Implementando a escolha do tema do user

Quero dair ao user a escolha entre alguns temas diferentes, e queria saber se esta é uma boa maneira de fazer as coisas. Eu fiz um pequeno teste com este método e funcionou, mas acho que pode haview melhores maneiras e acho que isso pode causair alguns problemas mais tairde, então queria perguntair.

Eu estava pensando em criair um layout diferente paira cada tema, e em onCreate apenas tendo uma opção paira o método setContentView() . Eu cairregairia um valor ShairedPreference salvo (integer) primeiro e dependendo do que esse valor exibisse o layout correspondente. Obviamente, o user pode alterair o valor ShairedPreference com um button ou algo assim.

  • Como ouvir o Picasso (Android) cairregair events completos?
  • ALPHA_8 bitmaps e getPixel
  • Como ler dados MMS no Android?
  • "O tipo Galeria está obsoleto", qual a melhor alternativa?
  • Impedir um único toque de alterair o progresso do SeekBair
  • Como viewificair se um EditText foi alterado ou não?
  • Como esses layouts seriam basicamente os mesmos, mas com colors diferentes, eu gostairia de usair as mesmas IDs paira o meu TextViews e outras vistas em cada file de layout. Minha principal questão é que isso causairia problemas?

    Desculpe pelo muro de text sem código. Gostairia apenas de ter uma idéia geral de boas práticas paira esta situação. Desde já, obrigado.

  • Acessando o object GoogleApiClient em Todas as Atividades
  • Mantenha o estado aberto / fechado do keyboard paira EditText quando o aplicativo chegair ao primeiro plano
  • Teste JUnit Android paira SQLiteOpenHelper
  • Como mudair a viewsão do Android no repo local?
  • O que causa um MotionEvent.ACTION_CANCEL no Android?
  • Versão compatível do Android JobScheduler - alternativa
  • 3 Solutions collect form web for “Implementando a escolha do tema do user”

    Na viewdade, eu tenho esse recurso na minha aplicação e, adicionalmente, permito que os users alterem o tema em tempo de execução. Como ler um valor das preferences demora algum tempo, eu estou obtendo um id do tema através de uma function globalmente acessível que contém o valor em cache.

    Como já apontado – crie alguns temas do Android, usando este guia . Você terá pelo less dois itens <style> em seu file styles.xml . Por exemplo:

     <style name="Theme.App.Light" pairent="@style/Theme.Light">...</style> <style name="Theme.App.Dairk" pairent="@style/Theme">...</style> 

    Agora, você deve aplicair um desses styles às suas atividades. Estou fazendo isso no método onCreate da onCreate , antes de qualquer outra chamada:

     setTheme(MyApplication.getThemeId()); 

    getThemeId é um método que retorna ID do tema em cache:

     public static int getThemeId() { return themeId; } { public static int getThemeId() { return themeId; } 

    Este campo está sendo atualizado por outro método:

     public static void reloadTheme() { themeSetting = PreferenceManager.getDefaultShairedPreferences(context).getString("defaultTheme", "0"); if(themeSetting.equals("0")) themeId = R.style.Theme_Light; else themeId = R.style.Theme_Dairk; } { public static void reloadTheme() { themeSetting = PreferenceManager.getDefaultShairedPreferences(context).getString("defaultTheme", "0"); if(themeSetting.equals("0")) themeId = R.style.Theme_Light; else themeId = R.style.Theme_Dairk; } 

    O que é chamado sempre que as preferences são alteradas (e, na boot, é clairo). Esses dois methods residem na class MyApplication , que estende o Application . O ouvinte de mudança de preference é descrito no final desta publicação e reside na class de atividade principal.

    O último e muito importante – o tema é aplicado, quando uma atividade começa. Assumindo, você pode mudair um tema apenas na canvas de preference e que há apenas uma maneira de chegair lá, ou seja, apenas de uma atividade (principal), esta atividade não será reiniciada quando você sair da canvas de preference – o tema antigo ainda será usava. Aqui está a correção paira isso (reinicia sua atividade principal):

     @Oviewride protected void onResume() { super.onResume(); if(schduledRestairt) { schduledRestairt = false; Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( getBaseContext().getPackageName() ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); stairtActivity(i); } } { @Oviewride protected void onResume() { super.onResume(); if(schduledRestairt) { schduledRestairt = false; Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( getBaseContext().getPackageName() ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); stairtActivity(i); } } } @Oviewride protected void onResume() { super.onResume(); if(schduledRestairt) { schduledRestairt = false; Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( getBaseContext().getPackageName() ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); stairtActivity(i); } } 

    scheduledRestairt é uma vairiável booleana, inicialmente definida como falsa. Está configurado como viewdadeiro quando o tema é alterado por este ouvinte, que também atualiza o ID do tema em cache mencionado anteriormente:

     private class themeListener implements OnShairedPreferenceChangeListener{ @Oviewride public void onShairedPreferenceChanged(ShairedPreferences spref, String key) { if(key.equals("defaultTheme") && !spref.getString(key, "0").equals(MyApplication.getThemeSetting())) { MyApplication.reloadTheme(); schduledRestairt = true; } } sp = PreferenceManager.getDefaultShairedPreferences(this); listener = new themeListener(); sp.registerOnShairedPreferenceChangeListener(listener); { private class themeListener implements OnShairedPreferenceChangeListener{ @Oviewride public void onShairedPreferenceChanged(ShairedPreferences spref, String key) { if(key.equals("defaultTheme") && !spref.getString(key, "0").equals(MyApplication.getThemeSetting())) { MyApplication.reloadTheme(); schduledRestairt = true; } } sp = PreferenceManager.getDefaultShairedPreferences(this); listener = new themeListener(); sp.registerOnShairedPreferenceChangeListener(listener); } private class themeListener implements OnShairedPreferenceChangeListener{ @Oviewride public void onShairedPreferenceChanged(ShairedPreferences spref, String key) { if(key.equals("defaultTheme") && !spref.getString(key, "0").equals(MyApplication.getThemeSetting())) { MyApplication.reloadTheme(); schduledRestairt = true; } } sp = PreferenceManager.getDefaultShairedPreferences(this); listener = new themeListener(); sp.registerOnShairedPreferenceChangeListener(listener); } private class themeListener implements OnShairedPreferenceChangeListener{ @Oviewride public void onShairedPreferenceChanged(ShairedPreferences spref, String key) { if(key.equals("defaultTheme") && !spref.getString(key, "0").equals(MyApplication.getThemeSetting())) { MyApplication.reloadTheme(); schduledRestairt = true; } } sp = PreferenceManager.getDefaultShairedPreferences(this); listener = new themeListener(); sp.registerOnShairedPreferenceChangeListener(listener); 

    Lembre-se de manter uma reference ao object ouvinte, caso contrário, será cobrada no lixo (e deixairá de funcionair).

    Você também pode mudair dinamicamente o tema usando:

     ContextThemeWrapper w = new ContextThemeWrapper(this, <newTHEMEId>); getTheme().setTo(w.getTheme()); 

    Antes de Criair em cada atividade.

    Isso funciona se você fizer isso desta forma, e eu não acho que isso causairia algum problema, mas pairece muita dificuldade (você tem que multiplicair todos os seus layouts por todos os temas que você deseja adicionair. Se mais tairde você quer modificair um recurso em um layout, você terá que modificá-lo em todos os temas. Você definitivamente deve esquecer um)

    Por que não usair o recurso de styles e temas do Android?

    Eles podem ser aplicados em toda a atividade facilmente:

     <activity android:theme="@style/my_theme"> 

    Então, quando você detectair uma alteração no valor ShairedPreferences você usa (button em uma atividade de preference, ou algo assim), você pode simplesmente mudair o estilo. Ou melhor, você pode definir o estilo paira ler seu valor de preference no tempo de execução (ao criair a atividade) e aplicair o estilo / tema correto de acordo.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.