2010-12-02 5 views
2

J'écris une application qui devrait prendre en charge les thèmes gui. Il n'y a pas de problème avec l'application et la configuration, mais un problème de compréhension est le changement de thème pour une activité particulière.Résoudre si le thème est modifié pour l'activité

Plusieurs activités utilisent des thèmes. Et il y en a un autre qui étend PreferenceActivity et fournit la fonctionnalité pour choisir un thème. L'identifiant du thème choisi est enregistré dans la préférence partagée. Quand une activité qui utilise des thèmes reçoit onResume(), je veux vérifier si l'identifiant du thème actuel est égal à celui enregistré dans les préférences partagées. Mais l'objet Theme n'a aucun ID ou méthode pour l'identifier. MISE À JOUR: Maintenant, je considère avoir un nom de chaîne du thème actuel dans chaque activité, mais cette solution semble plutôt moche, parce que je devrais ajouter la même variable à chaque activité dans l'application.

Quelle est la bonne façon de faire cette vérification? Est-ce que je fais quelque chose de mal?

Répondre

1

J'ai vu des applications nécessitant le redémarrage de l'application pour que les changements de thème prennent effet. Je ne pense pas que ce soit un problème. De cette façon, vous pouvez simplement appliquer le thème au démarrage et ne pas vous inquiéter à nouveau.

0

Cela peut être ce que vous voulez. J'utilise un indicateur de sorte qu'après avoir défini le thème dans une activité de paramètres et que vous reveniez à cette activité d'appel, l'activité d'appel sera redémarrée et le thème défini à une certaine valeur dans SharedPreferences.

private boolean activityStarted = false; 

public void onCreate(Bundle savedInstanceState) { 
    Log.d(DEBUG_TAG, "onCreate()"); 
    activityStarted = true; 
    setTheme(); // user-defined method 

    super.onCreate(savedInstanceState); 
    ... 
} 


@Override 
protected void onResume() { 
    super.onResume(); 
    Log.d(DEBUG_TAG, "onResume()"); 

    if(activityStarted == true){ // it has come from onCreate() 
    activityStarted = false; // Set flag to false so that next time onResume() 
          // is called after resuming existing activity, 
          // the activity will be restarted and theme will 
          // be set 
    } else { // it has directly come to onResume() 
    finish(); 
    startActivity(getIntent()); 
    } 

} 

Mise à jour

Je ne sais pas si cela est une meilleure façon de le faire, mais au lieu de mettre logique dans la méthode onResume(), je suis Redéfinition de la méthode onActivityResult() et le redémarrage du Activity si le Activity précédent était les paramètres Activity.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.settings) { 
     Intent settings_intent = new Intent(this, Settings.class); 
     startActivityForResult(settings_intent, SETTINGS); 
     return true; 
    } else { 
     return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public void onActivityResult(int reqCode, int resultCode, Intent data) { 
    super.onActivityResult(reqCode, resultCode, data); 

    // Identify our request code 
    switch (reqCode) { 
     case SETTINGS: 
      if (resultCode == RESULT_CANCELED) { 
       Log.d(DEBUG_TAG, "RESULT_CANCELED"); 
       finish(); 
       startActivity(getIntent()); 
      } else if (resultCode == RESULT_OK) { 
       Log.d(DEBUG_TAG, "RESULT_OK"); 
      } 

      break; 
    } 

} 
Questions connexes