码迷,mamicode.com
首页 > 其他好文 > 详细

替换ListView快速滚动按钮的图标

时间:2015-08-04 17:22:33      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:android   sdk   反射   

先看网上的例子

try {

Field f = AbsListView.class.getDeclaredField(“mFastScroller”);
f.setAccessible(true);
Object o=f.get(listView);
f=f.getType().getDeclaredField(“mThumbDrawable”);
f.setAccessible(true);
Drawable drawable=(Drawable) f.get(o);
drawable=getResources().getDrawable(R.drawable.icon);
f.set(o,drawable);
Toast.makeText(this, f.getType().getName(), 1000).show();
} catch (Exception e) {
throw new RuntimeException(e);

}

在实际应用中,该代码会出现异常,通过对几个sdk源码的对比,发现google会对其中的属性做一些微调:

如在5.x中,“mFastScroller”改为了“mFastScroll”,4.4中则把“mThumbDrawable”改为“thumbDrawable”并设为了final,在5.x中又恢复成了private.

所以在实际应用中还需加以判断。下面是针对4.4修改后的代码:

由于class FastScroller没有public属性,无法直接导包获取到,所以从用到该类的AbsListView中获取。

    try {

           Field f = AbsListView.class.getDeclaredField("mFastScroller");  //获取AbsListView中的属性mFastScroller
            f.setAccessible(true);//设置属性可修改
            Object o = f.get(listview);//得到listview实例
          //   Field[] fields = f.getType().getDeclaredFields();
          //    for (Field field : fields) {
          //       Log.v("TAG", field.getName());
          //    } //查看所有属性名
            f = f.getType().getDeclaredField("mThumbImage");//获取属性mThumbImage(由于 4.4中的thumbDrawable不可修改,所以直接取其imageview)
            f.setAccessible(true);
            ImageView img = (ImageView) f.get(o);   //得到ImageView实例     
            img.setImageDrawable(getResources().getDrawable(R.drawable.icon));
            f.set(o, img);   //把编辑好的ImageView放进去      
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

版权声明:本文为博主原创文章,未经博主允许不得转载。

替换ListView快速滚动按钮的图标

标签:android   sdk   反射   

原文地址:http://blog.csdn.net/u011808801/article/details/47277509

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!