Thème/Style n'est pas appliqué lorsque inflater utilisé avec ApplicationContext
J'ai le thème qui spécifie textColor pour TextView rouge.
Je suis en utilisant LayoutInflater pour instancier TextView. Le problème est que les styles ne sont pas appliquées à TextView quand inflater créé à l'aide de ApplicationContext - la couleur n'est pas rouge. Tout fonctionne bien lorsque LayoutInflater créé à l'aide de l'activité.
Pourquoi cela se produit et comment peut être fixe?
/res/values/styles.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme">
<item name="android:textViewStyle">@style/MyTextView</item>
</style>
<style name="MyTextView" parent="@android:style/Widget.TextView">
<item name="android:textColor">#f00</item>
</style>
</resources>
AndroidManifest.xml:
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/MyTheme"
>
Code:
public class A extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_a);
final LayoutInflater goodInflater = getInflater((Activity)this);
final LayoutInflater badInflater = getInflater(getApplicationContext());
final LinearLayout container = (LinearLayout)findViewById(R.id.container);
findViewById(R.id.add_with_appContext).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
add(container, badInflater); //Creates gray TextView
}
});
findViewById(R.id.add_with_activity).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
add(container, goodInflater); //Creates red TextView
}
});
}
private LayoutInflater getInflater(Context context) {
return (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
private void add(LinearLayout container, LayoutInflater inflater) {
inflater.inflate(R.layout.my_template, container, true);
}
}
/res/layout/test_a.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:text="Add with AppContext"
android:id="@+id/add_with_appContext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:text="Add with Activity"
android:id="@+id/add_with_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<LinearLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
/>
</LinearLayout>
/res/layout/my_template.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/text"
android:text="Some text..."
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
Vous devez vous connecter pour publier un commentaire.
Solution # 1
Gonfler méthode accepte facultatif ViewGroup root' argument:
Si nous avons de la valeur à transmettre en tant que 'root' paramètre, que nous pouvons donc l'utiliser pour obtenir l'activité de contexte " d'où l'on peut obtenir de bons LayoutInflater:
Donc mon code:
Solution # 2
Juste essayé de définir le Contexte de l'Application du thème de la programmation, et il œuvres:
Je pense qu'il était logique de s'attendre à ce balisage:
pour la régler automatiquement, mais il ne le fait pas.
N'utilisez jamais un Contexte d'Application pour gonfler le nombre de vues, parce que le style ne fonctionne pas avec ce contexte. Utilisez toujours une Activité du contexte lors de la lecture avec vue. La seule exception est lorsque vous avez besoin pour créer RemoteViews à partir d'un Service.
Plus d'infos sur les différents types de Contextes et de leurs capacités peuvent être trouvés dans cet excellent article.
getContext()
pour gonfler l'enfant-points de vue au lieu d'utiliser la vue parent du contexte en appelantparent.getContext()
oùparent
est de typeViewGroup
.J'ai l'habitude de venir à travers cette question à gonfler un affichage personnalisé. Voici ce que j'ai personnellement faire pour garder le même thème de l'activité dans le CustomView