在通过阅读Resources资源加载的流程后,知道了Android的资源加载都是通过Resources这个类来加载的,所以我们也来写一个小型的插件式换肤的demo
主要就是在Activiy里面写了,主要的思路还是通过自己去new 一个Resources对象,通过这个Resources对象去读取另外一个apk包里面的资源图片,通过id去拿到这个drawable对象即可,下面就是这个activity的代码,非常简单
public class MainActivity extends AppCompatActivity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.id_demo_iv); findViewById(R.id.id_demo_tv).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { AssetManager assetManager = AssetManager.class.newInstance(); Method method = AssetManager.class.getDeclaredMethod("addAssetPath",String.class); // Log.e("--->","invoke = "+Environment.getExternalStorageDirectory().getAbsolutePath()); //如果是私有的方法 // method.setAccessible(true); Object invoke = method.invoke(assetManager, Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "lol.skin"); // Log.e("--->","invoke = "+invoke); Resources superRes = getResources(); Resources resources = new Resources(assetManager,superRes.getDisplayMetrics(),superRes.getConfiguration()); // Resources resources = new Resources(assetManager,new DisplayMetrics(),new Configuration()); //根据图片名字,包名去拿到图片Id int drawableId = resources.getIdentifier("lol","drawable","com.example.gui.resskin"); Log.e("--->","drawableId = "+drawableId); Drawable drawable = resources.getDrawable(drawableId); imageView.setImageDrawable(drawable); } catch (Exception e) { e.printStackTrace(); } } }); } }下面再是我们是布局文件,也是写的很简单的一个布局。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.gui.skindemo.MainActivity"> <TextView android:id="@+id/id_demo_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <ImageView android:id="@+id/id_demo_iv" android:src="@drawable/lol" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
这样,我们就能从另外一个apk里,拿到我们想要的图片资源了。
最后附上Apk文件
链接:http://pan.baidu.com/s/1dFKneCD 密码:w0ie
当然,skin文件是需要我们手动放置到手机内存卡目录下的,这样apk文件安装才可以运行