(源码阅读)插件式换肤的demo的实现

在通过阅读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文件安装才可以运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值