Zamanında ağır basan kaynakları
Sorun
Uygulamalarım R. renk gibi kaynakları geçersiz kılmak mümkün olmak istiyorum.brand_colour veya R. drawable.zamanında ic_action_start. Başvurum marka renk ve görüntü sağlayacaktır CMS sistemine bağlanıyor. App CMS verileri indirilmesinin re-cilt kendisi için olması gerekiyor.
Söylemek hakkında ne olduğunu biliyorum - çalışma anında geçersiz kılma kaynakları mümkün değildir.
Bunun dışında sanki. Özellikle bu Bachelor Thesis temel kavramlarını açıklıyor 2012 buldum - android Activity sınıfı attachBaseContext yöntemi içeren ContextWrapper
, genişletir. AttachBaseContext getColor ve getDrawable gibi yöntemleri geçersiz kılan kendi özel bir sınıf ortamı sarmak için geçersiz kılabilirsiniz. GetColor kendi uygulaması istedi ancak rengi görünebilir. Calligraphy library yükleme özel yazı tipleri ile anlaşması olan özel bir Layoutİnflator enjekte etmek için benzer bir yaklaşım kullanır.
Kod
Bu yaklaşım bir renk yüklenmesini geçersiz kılmak için kullandığı basit bir Aktivite oluşturduk.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(new CmsThemeContextWrapper(newBase));
}
private class CmsThemeContextWrapper extends ContextWrapper{
private Resources resources;
public CmsThemeContextWrapper(Context base) {
super(base);
resources = new Resources(base.getAssets(), base.getResources().getDisplayMetrics(), base.getResources().getConfiguration()){
@Override
public void getValue(int id, TypedValue outValue, boolean resolveRefs) throws NotFoundException {
Log.i("ThemeTest", "Getting value for resource " getResourceName(id));
super.getValue(id, outValue, resolveRefs);
if(id == R.color.theme_colour){
outValue.data = Color.GREEN;
}
}
@Override
public int getColor(int id) throws NotFoundException {
Log.i("ThemeTest", "Getting colour for resource " getResourceName(id));
if(id == R.color.theme_colour){
return Color.GREEN;
}
else{
return super.getColor(id);
}
}
};
}
@Override
public Resources getResources() {
return resources;
}
}
}
Sorun, işe yaramıyor! Günlük gösterir/theme_colour hiç yüklenir renk düzeni gibi kaynakları/activity_main yük ve/ic_launcher ancak mipmap için çağırır. Bağlam pencere ve eylem bar, ama etkinliğin içeriğini view oluşturmak için kullanılıyor gibi görünüyor.
SorularımaNerede düzen şişirme etkinlikleri kapsamında değilse kaynaklardan yüklemek?Ayrıca bilmek istiyorumİşe yarar bir şekilde zamanında renkler ve drawables yükleme geçersiz kılmak var mı?
Alternatif yaklaşımlar hakkında bir kelime
Biliyorum mümkün için tema uygulaması CMS verileri başka şekillerde - örneğin yapabiliriz oluşturma yöntemi getCMSColour(String key)
zaman içinde biz onCreate()
elimizde bir sürü kod boyunca satır:
myTextView.setTextColour(getCMSColour("heading_text_colour"))
Benzer bir yaklaşım drawables, dizeleri, vb için alınabilir. Ancak bu bakımı ihtiyacı olan tüm demirbaş kodu - büyük miktarda neden olur. UI değiştirirken belirli bir görünüm rengini ayarlamak için unutmak kolay olurdu.
Sarma kendi özel değerleri vardır dönmek Kapsamında 'temiz' ve kırılması. daha az eğilimli Neden çalışmıyor anlamak için, alternatif yaklaşımlar keşfetmeden önce istiyorum.
CEVAP
"Dinamik olarak geçersiz kılma kaynakları" senin sorunun, daha temiz bir yaklaşım resmi veri bağlama uygulaması kullanmak olacaktır, ben inanıyorum ki basit bir çözüm gibi görünebilir anlamına gelmez beri. https://developer.android.com/tools/data-binding/guide.html ^em>hackandroid.
Marka ayarlarınızı bir POJO kullanarak geçebilirsiniz. @color/button_color
gibi statik stilleri kullanmak yerine @{brandingConfig.buttonColor}
yaz ve istediğiniz değerleri ile görüşlerinizi bağlama. Uygun aktivite bir hiyerarşi ile, çok fazla klişe eklemek olmamalı.
Bu da değiştirmek için yeteneği verir düzeni daha karmaşık unsurları, yani: diğer düzen markalaşma ayarları, UI çok çaba olmadan son derece yapılandırılabilir hale bağlı olarak. farklı düzenleri de dahil olmak üzere
Polimorfizmi ağır basan vs vs Aşırı...
Ağır basan bir JavaScript aslı başvuru...
Ağır basan bir default_scope Raylar...
Bir temel sınıf'In sanal işlev İ&...
Ya da alt sınıfların özellikleri ağır ...