android程式如何應用多種主題風格

來源:互聯網
上載者:User

原理:主程式與主題apk使用相同的sharedUserId, 使得主程式可以訪問主題apk包中的資源

 

主程式:MainSkin.apk

主題包:SkinTest1.apk, SkinTest2.apk

 

MainSkin實現一個activity來載入SkinTest1或SkinTest2中的資源,給自己設定不同主題的背景圖片和按鈕圖片

 

MainSkin的AndroidManifest.xml如下:

 

<?xml version="1.0" encoding="utf-8"?><br /><manifest xmlns:android="http://schemas.android.com/apk/res/android"<br /> package="com.huyuke.mainskin"<br /> android:sharedUserId="com.huyuke.mainskin"><br /> <application<br />android:label="@string/app_name"<br /> android:launchMode="singleInstance"<br /> android:debuggable="true"<br /> android:allowTaskReparenting="true"><br /> <activity android:name="MainSkinActivity"><br /> <intent-filter><br /> <action android:name="android.intent.action.MAIN"/><br /> <category android:name="android.intent.category.LAUNCHER"/><br /> </intent-filter><br /> </activity><br /> <receiver android:name="SkinPackagesManager"><br /> <intent-filter><br /> <action android:name="android.intent.action.PACKAGE_ADDED" /><br /> <action android:name="android.intent.action.PACKAGE_CHANGED" /><br /> <action android:name="android.intent.action.PACKAGE_DATA_CLEARED" /><br /> <action android:name="android.intent.action.PACKAGE_INSTALL" /><br /> <action android:name="android.intent.action.PACKAGE_REMOVED" /><br /> <action android:name="android.intent.action.PACKAGE_REPLACED" /><br /> <action android:name="android.intent.action.PACKAGE_RESTARTED" /><br /><action android:name="android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE"/><br /><action android:name="android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE"/><br /><data android:scheme="package"/><br /> </intent-filter><br /> </receiver><br /> </application><br /></manifest><br />

MainSkin的Acitivity定義:

package com.huyuke.mainskin;<br />import android.app.Activity;<br />import android.content.Context;<br />import android.content.pm.PackageManager.NameNotFoundException;<br />import android.content.pm.PackageInfo;<br />import android.content.res.Resources;<br />import android.os.Bundle;<br />import android.os.Process;<br />import android.widget.LinearLayout;<br />import android.widget.Button;<br />import android.view.View;<br />import android.view.View.OnClickListener;<br />import android.util.Log;<br />import java.util.ArrayList;<br />public class MainSkinActivity extends Activity implements OnClickListener {<br /> private static final String TAG = "MainSkinActivity";<br /> private LinearLayout mBg;<br /> private Button mBtn;<br /> private Resources defaultRes = null;<br /> private ArrayList<String> mSkinPkgs = new ArrayList<String>();<br /> private int mCurrSkinIndex = 0;<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> setTitle(R.string.theme_name);<br /> mBg = (LinearLayout) findViewById(R.id.linear_layout_1);<br /> mBtn = (Button) findViewById(R.id.btn_change_skin);<br /> mBg.setBackgroundResource(R.drawable.bg);<br /> mBtn.setBackgroundResource(R.drawable.btn_normal);<br /> mBtn.setOnClickListener(this);<br /> getSkinPackages();<br /> }<br /> public void onClick(View v) {<br /> String skinPkgToSet= mSkinPkgs.get(mCurrSkinIndex);<br /> mCurrSkinIndex++;<br /> if (mCurrSkinIndex == mSkinPkgs.size()) {<br /> mCurrSkinIndex = 0;<br /> }<br /> applySkin(skinPkgToSet);<br /> }<br /> private void applySkin(String skinPkg){<br /> Context skinContext;<br /> try {<br /> skinContext = this.createPackageContext(skinPkg, Context.CONTEXT_IGNORE_SECURITY);<br /> } catch (NameNotFoundException e) {<br /> Log.e(TAG, "createPackageContext exception: " + e);<br /> e.printStackTrace();<br /> return;<br /> }<br /> Resources res = skinContext.getResources();<br /> /*<br /> OR<br /> try {<br /> res = getPackageManager().getResourcesForApplication(skinPkg);<br /> } catch (NameNotFoundException e) {<br /> Log.e(TAG, "getResourcesForApplication exception: " + e);<br /> return;<br /> }<br /> */<br /> mBg.setBackgroundDrawable(res.getDrawable(res.getIdentifier("bg", "drawable", skinPkg)));<br /> mBtn.setBackgroundDrawable(res.getDrawable(res.getIdentifier("btn_normal", "drawable", skinPkg)));<br /> setTitle(res.getString(res.getIdentifier("theme_name", "string", skinPkg)));<br /> }<br /> private void getSkinPackages() {<br /> String[] skinPkgs = getPackageManager().getPackagesForUid(Process.myUid());<br /> String self = getPackageName();<br /> for (String skinPackage: skinPkgs) {<br /> Log.i(TAG, "package for this user: " + skinPackage);<br /> if (!(self.equals(skinPackage))) {<br /> Log.i(TAG, "this is a skin package");<br /> mSkinPkgs.add(skinPackage);<br /> }<br /> }<br /> Log.i(TAG, "I have " + mSkinPkgs.size() + " skins");<br /> }<br />}<br />

 

同時MainSkin中需要放一套預設圖片資源

 

主題包中不需要代碼,只需要資源檔和在manifest裡面聲明和主程式MainSkin使用相同的sharedUserId即可,

在這兩個主題包中分別放了兩套不同的圖片,每套圖包括一張activity背景圖和一張button背景圖

如SkinTest1的AndroidManifest.xml內容如下:

<?xml version="1.0" encoding="utf-8"?><br /><manifest xmlns:android="http://schemas.android.com/apk/res/android"<br /> package="com.huyuke.skintest1"<br /> android:sharedUserId="com.huyuke.mainskin"><br /></manifest> 

 

顯示效果:


  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.