android换肤功能 如何动态获取控件中背景图片的资源id?

android换肤功能 如何动态获取控件中背景图片的资源id?,第1张

概述这个是在在做一个换肤功能时遇到的问题。  对于换肤,网上都有示例,可以从别的皮肤安装包中读取所要的资源,前提是你必须先持有这个资源的引用名称,像R.drawable.background(喂,这不是废话嘛)。这个

这个是在在做一个换肤功能时遇到的问题。  

对于换肤,网上都有示例,可以从别的皮肤安装包中读取所要的资源,前提是你必须先持有这个资源的引用名称,像R.drawable.background(喂,这不是废话嘛)。这个换肤的方案原理就是,自身应用的资源名称是R.drawable.background,那皮肤包中应该也是这个名称,然后通过这个名称获取该资源在皮肤包中的具体ID,代码:

  //先获取本地资源引用名称,type name是R.drawable.background中的"drawable",entry name是"background"  String resTypename = getContext().getResources().getResourceTypename(ID);  String resEntryname = getContext().getResources().getResourceEntryname(ID);  //然后创建皮肤包所在应用的Context  Context apk = getContext().createPackageContext(packagename,Context.CONTEXT_IGnorE_Security)  //然后就是获取皮肤包中的资源ID了  int drawavleID = apk.getResources().getIDentifIEr(resEntryname,resTypename,apk.getPackagename());  

这个换肤方案中,每个Activity在切换皮肤时,需要遍历整个layout,判断控件如果ID中包含“skin”的字符,意味这个控件是需要换肤的控件,这个控件的ID可以先保存下来。

遍历视图的代码 

  private List<Integer> skinVIEwList = new ArrayList<Integer> ();  private voID scanVIEwGroup(VIEwGroup group,List<Integer> skinVIEwList,Resources res) {    //first we need check if this VIEwGroup have a background    if(group.getID() != VIEw.NO_ID        && res.getResourceEntryname(group.getID()).contains(SKIN_PATTERN)        && !skinVIEwList.contains(group)) {      skinVIEwList.add(group.getID());    }    //second check its child vIEw    VIEw child;    for(int i = 0; i < group.getChildCount(); i++) {      child = group.getChildAt(i);      if(child instanceof VIEwGroup) {        scanVIEwGroup((VIEwGroup)child,skinVIEwList,res);      } else if(child.getID() == VIEw.NO_ID) {        return;      } else {        int vIEwID = child.getID();        String entryname = res.getResourceEntryname(vIEwID);        Log("scanVIEwGroup(),entryname of this childVIEw : " + entryname);        if(entryname.contains(SKIN_PATTERN) && !skinVIEwList.contains(child))          skinVIEwList.add(child.getID());      }    }  }

问题来了,本地应用中,你持有一个控件,比如button,它的ID可以直接调用button.getID()方法获取,但是它的背景图片background呢,我们可以调用button.getBackground()方法获取其对象,但是却没有方法可以获取这个资源图片的引用名称,也就无法得到它的具体ID了。后面想到的方案就是,在每次Activity初始化的时候,我们事先遍历每一个控件的属性集AttributeSet,有需要换肤的控件,将其androID:background这个属性的值保存下来,为此,需要重载Activity的onCreateVIEw(String name,Context context,AttributeSet attrs)方法,这个方法我的理解是在Activity中每个控件(包括linearLayout、TextVIEw、button等等)初始化前会调用,我也打了log,进行了验证,其中attrs参数就是该控件的属性集,这就是我们需要的,代码: 

    //先判断前面扫描的skinVIEwList是否为空,不为空意味着有控件需要换肤    if(skinVIEwList != null && skinVIEwList.size() > 0) {      int vIEwID = -1,backgroundID = -1;      for(int i = 0; i < attrs.getAttributeCount(); i++) {        if(attrs.getAttributename(i).equals("ID")) {          vIEwID = attrs.getAttributeResourceValue(i,-1);        }        if(attrs.getAttributename(i).equals("background")) {          backgroundID = attrs.getAttributeResourceValue(i,-1);        }      }      //check if background drawable need save      if(vIEwID != -1 && backgroundID != -1 &&          drawableIDList != null && !drawableIDList.containsKey(vIEwID)) {        drawableIDList.put(vIEwID,backgroundID);        Log("add to drawableIDList,vIEwID = " + vIEwID            + ",backgroundID = " + backgroundID);      }    }

有了这个backgroundID,就能获取该资源的引用名称R.drawable.background,然后我们就能通过名称从其他包获取对应的资源文件了,从而可以执行换肤 *** 作。而且,通过这个方法,不只可以获取图片资源的ID,也能获取字符串如R.string.Title,字体颜色如R.color.red,字体大小如R.dimens.text_size_small等等属性,从而扩大换肤的范围。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的android换肤功能 如何动态获取控件中背景图片的资源id?全部内容,希望文章能够帮你解决android换肤功能 如何动态获取控件中背景图片的资源id?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1148396.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存