Android 反射-换一种方式编程

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/59109933

本文出自【赵彦军的博客】

上一次写了一篇文章 Java 反射 使用总结 , 今天算是对反射的补充,只不过把反射用到了Android层面上。

首先创建工具类 ResourceUtils

  1. package com.app.fanse;
  2. import android.content.Context;
  3. import android.graphics.drawable.Drawable;
  4. public class ResourceUtils {
  5. public static int getIdByName(Context context, String className, String name) {
  6. return context.getResources().getIdentifier(name, className, context.getPackageName());
  7. }
  8. /**
  9. * 获取布局文件的资源ID
  10. * @param context
  11. * @param name
  12. * @return
  13. */
  14. public static int getIdFromLayout(Context context, String name) {
  15. return getIdByName(context, "layout", name);
  16. }
  17. /**
  18. * 从控件中获取资源的ID
  19. * @param context
  20. * @param name
  21. * @return
  22. */
  23. public static int getIdFromId(Context context, String name) {
  24. return getIdByName(context, "id", name);
  25. }
  26. /**
  27. * 从 strings.xml 里面获取资源的ID
  28. * @param context
  29. * @param name
  30. * @return
  31. */
  32. public static int getIdFromString(Context context, String name) {
  33. return getIdByName(context, "string", name);
  34. }
  35. /**
  36. * 从 Drawable 里面获取资源的ID
  37. * @param context
  38. * @param name
  39. * @return
  40. */
  41. public static int getIdFromDrawable(Context context, String name) {
  42. return getIdByName(context, "drawable", name);
  43. }
  44. /**
  45. * 从 Mipmap 里面获取资源的ID
  46. * @param context
  47. * @param name
  48. * @return
  49. */
  50. public static int getIdFromMipmap(Context context, String name) {
  51. return getIdByName(context, "mipmap", name);
  52. }
  53. /**
  54. * 从 strings.xml 里面获取字符串
  55. * @param context
  56. * @param name
  57. * @return
  58. */
  59. public static String getResString(Context context, String name) {
  60. return context.getString(getIdFromString(context, name));
  61. }
  62. /**
  63. * 从Drawable目录获取 Drawable 对象
  64. * @param context
  65. * @param name
  66. * @return
  67. */
  68. public static Drawable getDrawableFromString(Context context, String name ){
  69. return context.getResources().getDrawable( getIdFromDrawable( context , name ) ) ;
  70. }
  71. /**
  72. * 从Mipmap目录获取 Drawable 对象
  73. * @param context
  74. * @param name
  75. * @return
  76. */
  77. public static Drawable getMipmapFromString(Context context, String name ){
  78. return context.getResources().getDrawable( getIdFromMipmap( context , name ) ) ;
  79. }
  80. }

工具类的使用

首先新建布局文件 activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
  4. android:layout_width="match_parent" android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context="com.app.fanse.MainActivity">
  10. <TextView
  11. android:id="@+id/tv"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="Hello World!" />
  15. <ImageView
  16. android:id="@+id/image"
  17. android:layout_below="@id/tv"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content" />
  20. </RelativeLayout>

然后创建MainActivity

  1. package com.app.fanse;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.widget.ImageView;
  5. import android.widget.TextView;
  6. public class MainActivity extends AppCompatActivity {
  7. private TextView textView ;
  8. private ImageView imageView ;
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. //获取布局文件id
  13. int layoutID = ResourceUtils.getIdFromLayout( this , "activity_main" ) ;
  14. setContentView( layoutID );
  15. //获取TextView 的 id
  16. textView = (TextView) findViewById( ResourceUtils.getIdFromId( this , "tv"));
  17. //获取 strings.xml 中的字符串
  18. textView.setText( ResourceUtils.getResString( this , "tv_des"));
  19. //获取ImageView 的 id
  20. imageView = (ImageView) findViewById( ResourceUtils.getIdFromId( this , "image"));
  21. //获取 Mipmap 里面的 Drawable
  22. imageView.setImageDrawable( ResourceUtils.getMipmapFromString( this , "ic_launcher"));
  23. //获取 Drawable 里面的 Drawable
  24. imageView.setImageDrawable( ResourceUtils.getDrawableFromString( this , "ic_launcher"));
  25. }
  26. }

那么效果怎么样呢?请看效果图


个人微信号:zhaoyanjun125 , 欢迎关注

Android 反射-换一种方式编程的更多相关文章

  1. Android 数据存储五种方式

    1.概述 Android提供了5种方式来让用户保存持久化应用程序数据.根据自己的需求来做选择,比如数据是否是应用程序私有的,是否能被其他程序访问,需要多少数据存储空间等,分别是: ① 使用Shared ...

  2. android 定位的四种方式

    [原文]  开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面总结了一下网络中现有对于介绍android定位的4种方式,希望对大家有帮助: android 定 ...

  3. 【转】在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)

    在Android Studio中下载Android SDK的两种方式(Android Studio3.0.windows) 方式一.设置HTTP Proxy1. 打开Settings2. 点击HTTP ...

  4. android 定位的几种方式介绍

    [地理位置] android 定位的几种方式介绍 开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络 ...

  5. Android学习—下载Android SDK的两种方式

    在Android Studio中下载Android SDK的两种方式 Android studio下载地址:http://www.android-studio.org/ 方式一.设置HTTP Prox ...

  6. 将Eclipse代码导入到Android Studio的两种方式

    转: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0104/2259.html 说到使用Android Studio,除了新建 ...

  7. Android数据存储五种方式总结

    本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据     2 文件存储数据       3 SQLite数据库存储数据 4 使用Cont ...

  8. Android视频播放的两种方式介绍

    1.在Android 中播放视频的方式有两种: 第一种方式是使用MediaPlayer 结合SurfaceView 来播放,通过MediaPlayer来控制视频的播放.暂停.进度等: 通过Surfac ...

  9. Android事件处理的2种方式:监听器与回调

    android组件的事件处理有2种方式: 1.基于监听器的事件处理方式:先定义组件,然后为组件设定监听器. 详见http://blog.csdn.net/jediael_lu/article/deta ...

随机推荐

  1. phpmyadmin修改mysql数据库密码

    甩上链接:http://jingyan.baidu.com/article/e4511cf332b9832b845eaf27.html

  2. Mysql 多列形成主键(复合主键 )

    什么是数据表的复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成 比如 create table test (    name varchar(19),    id number,    ...

  3. javascript AOP

    Function.prototype.bind = function(b) { var a = this; return function() { a.apply(b, arguments) } }; ...

  4. 读书笔记--用Python写网络爬虫02--数据抓取

    抓取(scraping)---爬虫从网页中抽取一些数据用以实现某些用途. 三种抽取网页数据的方法:正则表达式.Beautiful Soup和lxml. 2.1 分析网页 通过浏览器自带选项,查看网页源 ...

  5. PHP新手之学习数组声明

    数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式.这些按序排列的同类数据元素的集合称为数组.下面介绍PHP中的数组声明. 一.数组的概述 1.数组的本质:管理 ...

  6. YII 1.0 上传文件

    $upload = CUploadedFile::getInstance($articleModel,'thumb'); if($upload){ $name = date("Ymd&quo ...

  7. CSS3 :target伪类实现Tab切换效果 BY commy

    http://www.shejidaren.com/examples/css3-target/css3-target.html#tab1 标签一 标签二 标签三 欢迎加设计达人Q群:50063010设 ...

  8. B-JUI 实践 之 带搜索与编辑的Datagrid

    使用B-JUI 1.31版本 DataGrid 页直接上代码: <div class="bjui-pageHeader" style="background-col ...

  9. 选项卡(TabHost)的功能与用法

    TabHost是一种非常实用的组件,TabHost可以很方便地在窗口上放置多个便签页,每个标签页相当于获得了一个与外部容器相同大小的组件摆法区域.通过这种方式,就可以在一个容器里放置更多组件,例如手机 ...

  10. swift 导航的使用

    导航还是有必要来搞一下的!!!!! 这只是一些基本的导航的使用.....感兴趣的猿可以自己去 废话不多   源码奉上   ⬇️ 首先  delegate里面 在 func application(ap ...