SORU
29 Mayıs 2015, Cuma


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
10 HAZİRAN 2015, ÇARŞAMBA


"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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007
  • NextKsa

    NextKsa

    7 EKİM 2009
  • MofoHifi Records

    MofoHifi Rec

    15 HAZİRAN 2006