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.?
La modification du style après la création de la vue n'est pas prise en charge. Vous pouvez donc:
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);
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);
}
} );
}
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!