2017-01-26 29 views
7

私はのstyles.xmlに定義することでテーマを設定し、そのアンドロイドの別のアプリリソースからテーマを変更するにはどうすればよいですか?

setTheme(android.R.style.MyTheme); 

ようにそれを使用する方法があります知っている。しかし、私は私が同様に開発された別のアプリからテーマを取得したいです。私はリソース名を知っていて、実際にはこのコードブロックでテーマIDを取得できます。

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

私がデバッグすると、resThemeIdがゼロではないことがわかります。

このテーマを設定するには、最後のコマンドが必要です。私は声明の下に書く場合super.onCreate()関数の前に、私はこのメソッドを実装しようとしたが、それはしかし、これに代えて

setTheme(resThemeId); 

が動作していないようだ、私は正常に動作

setTheme(android.R.style.Theme_Holo_Light); 

ので、異なるパッケージリソースのテーマを使用するにはどうすればよいですか?

+3

他のパッケージからリソースIDを取得できますが、そのリソースはAPKに存在しません。 'PackageManager#getResourcesForApplication(String packageName) 'を使ってリソースを読み込むことは、drawable、文字列、boolなどでうまくいくはずです。しかし、別のAPKのテーマを読み込むことは可能であり、推奨できません。 –

+0

私はdrawables、文字列、別のパッケージリソースからブール値を得ることができますが、私もテーマを得ることを期待しています。なぜそれは不可能ですか? – Berkay92

+0

可能です(私の答えを見てください)。テーマを適用できるように、他のアプリのリソースを返すにはgetResroucesをオーバーライドする必要があります。これにより、他のアプリケーションからすべての文字列、レイアウト、ドロワブル、およびその他のリソースも返されるため、推奨されません。 –

答えて

3

異なるパッケージリソースのテーマを使用するにはどうすればよいですか?

これはさまざまな理由で行うべきではありません。私はあなたの活動が使用するリソースがパッケージに含まれている限り、実際に可能であることを示す簡単なプロジェクトを書いています。

参照:https://github.com/jaredrummler/SO-41872033


基本的に、あなたは活動からパッケージの資源を返却する必要があるでしょう:

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; 
    } 

} 

これはちょうどそれが可能であることを示すことです。繰り返しますが、これを避けることをお勧めします。

+0

この方法で実行時にリソースを変更することは可能ですか?つまり、別のリソースからテーマを設定して元のリソースを設定したいのですか? – Berkay92

+0

それは可能だとは思いませんが、別のパッケージからテーマを適用することは可能だとも思っていませんでした。だから私はこのソリューションをお勧めしません。あなたはレイアウトや他のパッケージのリソースをあなたのアクティビティに使用したくありません。あなたはこれで何を達成しようとしていますか? –

+0

私は実際にテーママネージャといくつかのテーマ(テーマには、デフォルトのサウンド、アプリアイコンなどが含まれています)を含む異なるapkを書き込もうとします。私はテーママネージャアプリを開くと、drawableを取得し、それに従ってテーマapkからリストすることができます。ただし、テーマを変更すると、設定アプリなどの一部のアプリケーションテーマも変更したいと考えています。 (私は、プライマリ、アクセントの色などを設定したい)ところで、私はAOSPプロジェクトに取り組んでおり、設定コードを簡単に変更することができます。私が望むのは、自分のテーマアプリケーションリソースの1つから設定テーマを変更するだけです。 – Berkay92

4

コメント内で既に述べたように、他のアプリケーションのリソースにアクセスできますが、別のアプリケーションテーマを使用すると機能しません。


証拠を持って以来、常に良いことであるのは、ソースコードを見てみましょう(私はAPI 24個のソースを使用)

ActivitysetTheme()を呼び出すとなる、ContextThemeWrapper親クラスでinitializeTheme()を呼び出しますwが、今度は私たちがResourcesImpl.ThemeImplに次のように見ることができるラッパーResources.Themeを通じてチェーンに続きtheme.applyStyle(resId, true)

を呼び出すことによってリソースから実際のテーマのデータをロードしようとするonApplyThemeResource(..)を呼び出すに終わりますここAssetManagerをテーマにスタイルをロードするために呼び出されます。

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

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

あなたは他のアプリから外国テーマをロードしようと失敗する場所です。あなたはあなたが望むものを達成するためにどのような方法があることを思われないローカルな方法をされている静的呼び出しを使用するか、パッケージ化する必要があるだろう方法の最もので


(例えば適用するか、新しいテーマを作成します)

AssetManagergetAssets()というコンテキストで保留にしても、there is no accessible method to create or apply themesという文脈では、

他のアプリのリソースを使用する唯一の方法は、あなたにリソースを追加することです。

+0

sharedUserIdはどうですか?アプリケーションと署名の両方にsharedUserIdを設定した場合、同じ証明書で署名するとどうなりますか?私は頑張った。たぶん私はコードのどこかで間違っています – Berkay92

1

あなたはこのデモを見てきました:Multiple Theme Material Design

あなたはランタイムテーマの変更のため、このデモを確認することができます。

ご希望の場合はお手伝いします。

+0

質問は、デバイスにインストールされている別のパッケージからテーマを変更するよう求めました。これは、現在のパッケージのスタイルであらかじめ定義されたアプリケーションテーマを変更します。これはテーマを適用する推奨方法ですが、OPの質問には答えません。 –

関連する問題