web-dev-qa-db-fra.com

android changer dynamiquement de style à l'exécution

J'aimerais rendre mes tailles de police configurables, mais je voudrais également utiliser la balise de style dans mes mises en page. Est-il possible de changer la définition d'un style lors de l'exécution? ou est la seule option pour modifier manuellement les éléments de style individuels sur chaque affichage de texte, etc.?

37
Ben

La modification du style après la création de la vue n'est pas prise en charge. Vous pouvez donc:

  1. créer un nouveau Android fichier xml de valeurs de type
  2. ajouter un nouveau thème
  3. ajoutez vos éléments à ce thème et leurs valeurs et enregistrez le fichier

Maintenant, lorsque vous créez dynamiquement la nouvelle vue, vous appelez le constructeur qui permettra de définir un defStyle. Ensuite, vous pointez l'ID de style que vous venez de créer en pointant sur R. "le nom du fichier XML". "Votre ID de style"

myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
15
AhmadAssaf

L'exemple de code suivant modifie la taille/le style du texte de manière dynamique lors de l'exécution.

attrs.xml

  <?xml version="1.0" encoding="utf-8"?>
  <resources>
       <!-- View styles -->
       <attr name="textTitle" format="reference" />
       <attr name="textBody" format="reference" />
  </resources>

styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <style name="small_title_text">
      <item name="Android:textSize">22sp</item>
      <item name="Android:textColor">@color/green</item>
      <item name="Android:textStyle">normal</item>
      <item name="Android:paddingBottom">5dip</item>
   </style>
   <style name="small_body_text">
      <item name="Android:textSize">16sp</item>
      <item name="Android:textColor">@color/white</item>
      <item name="Android:textStyle">normal</item>
      <item name="Android:paddingBottom">5dip</item>
   </style>
   <style name="large_title_text">
      <item name="Android:textSize">28sp</item>
      <item name="Android:textColor">@color/red</item>
      <item name="Android:textStyle">normal</item>
      <item name="Android:paddingBottom">5dip</item>
   </style>

   <style name="large_body_text">
      <item name="Android:textSize">20sp</item>
      <item name="Android:textColor">@color/white</item>
      <item name="Android:textStyle">normal</item>
      <item name="Android:paddingBottom">5dip</item>
   </style>

  <!-- Base application theme is the default theme. -->
  <style name="Theme" parent="Android:Theme">
  </style>

  <style name="Theme.Small">
     <item name="textTitle">@style/small_title_text</item>
     <item name="textBody">@style/small_body_text</item>
  </style>

  <style name="Theme.Large">
      <item name="textTitle">@style/large_title_text</item>
      <item name="textBody">@style/large_body_text</item>
  </style>
 </resources>

main.xml

 <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:orientation="vertical"
     Android:layout_width="fill_parent"
     Android:layout_height="fill_parent"
     >

 <RadioGroup
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">
<RadioButton 
    Android:text="Large Text" 
    Android:id="@+id/textSizeLarge" 
    Android:layout_width="wrap_content" 
    Android:layout_height="wrap_content">
</RadioButton>
<RadioButton 
    Android:text="Small Text" 
    Android:id="@+id/textSizeSmall" 
    Android:layout_width="wrap_content" 
    Android:layout_height="wrap_content">
</RadioButton>
 </RadioGroup>
 <TextView  
      Android:id="@+id/title" 
style="?textTitle" 
     Android:layout_width="fill_parent" 
     Android:layout_height="wrap_content" 
     Android:text="Select the size of the text"
     />
 <TextView  
    Android:id="@+id/body" 
    style="?textBody" 
     Android:layout_width="fill_parent" 
     Android:layout_height="wrap_content" 
     Android:text="@string/message"
     />
 </LinearLayout>

Activity.Java

     public void onCreate(Bundle savedInstanceState) {
         if ("Large".equalsIgnoreCase( getIntent().getStringExtra( "Theme" )))
         {
             setTheme(R.style.Theme_Large);
         }
         else if ("Small".equalsIgnoreCase( getIntent().getStringExtra( "Theme" )))
         {
             setTheme(R.style.Theme_Small);
         }
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         RadioButton largeText = ( RadioButton ) findViewById( R.id.textSizeLarge );
         largeText.setOnClickListener( new OnClickListener() {
             public void onClick( View view ) {
                 Toast.makeText(context, "Large Text Selected", Toast.LENGTH_SHORT).show();
            Intent intent = getIntent();
            intent.putExtra( "Theme", "Large" );
            finish();
            startActivity(intent);
        }
    } );

    RadioButton smallText = ( RadioButton ) findViewById( R.id.textSizeSmall );
    smallText.setOnClickListener( new OnClickListener() {
        public void onClick( View view ) {
            Toast.makeText(context, "Small Text Selected", Toast.LENGTH_SHORT).show();
            Intent intent = getIntent();
            intent.putExtra( "Theme", "Small" );
            finish();
            startActivity(intent);
        }
    } );
}
93
Janarthanan

Je ne sais pas si cela fonctionnera dans votre cas, mais vous pouvez créer des thèmes qui définissent vos styles. Il y a Activity.setTheme() que vous passez dans un fichier XML de thème. Le thème contient un tas de définitions.

Je ne l'ai utilisé que pour remplacer certains styles globaux, comme la couleur d'arrière-plan, je ne sais pas si vous pouvez l'utiliser pour définir les styles que vos widgets utiliseront. Cela vaut la peine de lui donner un coup cependant. Si cela fonctionne, faites-le moi savoir!

5
EboMike