2017-01-26 12 views
7

styles.xml içinde tanımlayarak temaları ayarlayabilir ve ben de gelişmiştir başka bir uygulamanın temalar almak için oAndroid'de başka bir uygulama kaynağından tema nasıl değiştirilir? Bildiğim

setTheme(android.R.style.MyTheme); 

gibi Ancak, ben istiyorum kullanmak için bir yolu yoktur. Kaynak isimlerini biliyorum ve aslında bu kod bloğuyla tema idini alabiliyorum;

Resources res = getPackageManager().getResourcesForApplication("com.example.theme"); 
int resThemeId = res.getIdentifier("my_theme","style","com.example.theme"); 

Hata ayıklama yaparken, resThemeId öğesinin sıfır olmadığını görüyorum.

Bu temayı ayarlamak için son komuta ihtiyacım var. Ben deyimi altında yazarsanız super.onCreate() işlevi önce, bu yöntemi uygulamaya çalışıyorum ama buna Ama bunun yerine

setTheme(resThemeId); 

çalışmıyor görünüyor, ben gayet iyi çalışıyor

setTheme(android.R.style.Theme_Holo_Light); 

Yani , farklı paket kaynaklarından bir tema kullanmak için ne yapmalıyım?

+3

Kaynak kimliğini başka bir paketten alabilirsiniz, ancak bu kaynaklar APK'nızda mevcut değildir. 'PackageManager # getResourcesForApplication (String packageName)' kullanarak kaynakların yüklenmesi, drawables, string, booller, vb. Için çalışmalıdır. Ancak, başka bir APK'nın temasını yüklemenin mümkün ve kesinlikle tavsiye edilmediğine inanmıyorum. –

+0

Başka bir paket kaynağından elde edilebilir çizgilere, iplere ve boole sahip olsa da, temaları da almayı umuyorum. Neden imkansız? – Berkay92

+0

Mümkün (cevabıma bakın). Temayı uygulayabilmeniz için diğer uygulamanın kaynaklarını iade etmek üzere getResrouces'i geçersiz kılmanız gerekir. Bu ayrıca tüm dizeleri, düzenleri, çekilebilir malzemeleri ve diğer kaynakları diğer uygulamadan döndürecektir, bu nedenle, önerilmez. –

cevap

3

Peki, farklı paket kaynaklarından bir temayı kullanmak için ne yapmalıyım?

Bunu birçok nedenden dolayı yapmamalısınız. Paketin faaliyetinizin kullandığı kaynakları içerdiği sürece gerçekten mümkün olduğunu gösteren basit bir proje yazdım.

bakınız: https://github.com/jaredrummler/SO-41872033


Temel olarak, etkinlikten paketin kaynak dönmek gerekir:

public class MainActivity extends AppCompatActivity { 

    Resources resources; 

    @Override protected void onCreate(Bundle savedInstanceState) { 

    int themeResId = getResources().getIdentifier("AppTheme", "style", "com.example.theme"); 
    if (themeResId != 0) { 
     setTheme(themeResId); 
    } 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    } 

    @Override public Resources getResources() { 
    if (resources == null) { 
     try { 
     resources = getPackageManager().getResourcesForApplication("com.example.theme"); 
     } catch (PackageManager.NameNotFoundException e) { 
     resources = super.getResources(); 
     } 
    } 
    return resources; 
    } 

} 

Bu mümkün olduğunu göstermek için gönderilmiştir. Yine, bundan kaçınmanızı öneririm. Multiple Theme Material Design

Sen çalışma zamanı tema değişikliği için bu demo kontrol edebilirsiniz:

+0

kodunda bir yerde yanlış yapıyorum Kaynakları çalışma zamanında bu yolla değiştirmek mümkün mü? Başka bir kaynaktan tema ayarladıktan sonra orijinal kaynakları ayarlamak istiyorum? – Berkay92

+0

Bunun mümkün olduğunu düşünmüyorum, ancak başka bir paketten bir tema uygulamayı düşünmemek de mümkün değildi. Bu yüzden bu çözümü tavsiye etmem. Düzen için başka bir paketin kaynaklarını ve etkinliğinizdeki herhangi bir çekmeceyi kullanmak istemezsiniz. Bununla tam olarak ne elde etmeye çalışıyorsun? –

+0

Aslında bir tema yöneticisi ve bazı temaları içeren farklı bir apk yazmayı deniyorum (Temalar arka plan resimleri, varsayılan sesler, uygulama simgeleri vb. Içerir) Tema yöneticisi uygulamasını açtığımda, drawable'ları alabilir ve bunları temalardan temalar listeleyebilirim. Bununla birlikte, temayı değiştirdiğimde bazı uygulama temalarını (Ayarlar uygulaması gibi) değiştirmek istiyorum. (Birincil, vurgu renkleri ayarlamak istiyorum.) Bu arada, AOSP projesi üzerinde çalışıyorum ve Ayarlar kodunu kolayca değiştirebilirim. Tek istediğim tema teması kaynaklarından birinden Ayarlar temasını değiştirmektir. – Berkay92

4

Bir yorumda daha önce bahsedildiği gibi, diğer uygulamalardan kaynaklara erişebilirsiniz, ancak başka bir uygulama teması kullanmak işe yaramayacaktır.


kanıtı olan her zaman olduğundan iyi bir şey kaynak koduna bakalım hangi edecek, ContextThemeWrapper üst sınıfında initializeTheme() çağıracağı bir Activity üzerinde setTheme() çağrılması

(I API 24 kaynaklar kullanılır) w, sırayla biz ResourcesImpl.ThemeImpl olarak aşağıdaki görebilir sargı Resources.Theme aracılığıyla zincir sonra theme.applyStyle(resId, true)

arayarak kaynaklardan gerçek konu verileri yüklemek çalışacaktır olan onApplyThemeResource(..) arama sona Burada AssetManager tema içine stili yüklemek için denir:

void applyStyle(int resId, boolean force) { 
    synchronized (mKey) { 
     AssetManager.applyThemeStyle(mTheme, resId, force); 

     mThemeResId = resId; 
     mKey.append(resId, force); 
    } 
} 

denemek ve diğer uygulamasından yabancı tema yüklemek için başarısız yerdir. Eğer ne istediğinizi elde etmek için herhangi bir yolu olduğunu görünmüyor yerel yöntemler olan statik aramaları kullanabilir veya paketlemek gerekir yöntemlerin çoğu yana


,

(örn uygulayarak veya yeni Tema oluşturma)

Diğer uygulamanın AssetManager numaralı bağlayıcısını, there is no accessible method to create or apply themes numaralı bir bağlamda getAssets() kullanarak edinseniz bile.

Başka bir uygulamanın kaynaklarını kullanmanın tek yolu, kaynakları sizinkilere eklemektir.

+0

Nasıl sharedUserId hakkında? Her iki uygulama için sharedUserId koyup aynı sertifikayla imza atarsam ne olur? Denedim ama şans yok. Belki de – Berkay92

1

bu demoyu gördünüz mü.

Size yardımcı olacağını umuyorum.

+0

Temanın, cihazda yüklü farklı bir paketten değiştirilmesi istendi. Bu, uygulama temasını mevcut paketin stillerinde önceden tanımlandığı şekilde değiştirir. Bu temaların uygulanması için önerilen yol olsa da, OP'nin sorusuna cevap vermez. –

İlgili konular