java将属性练成字符串,Java中通过属性字符串名取属性内容

在Android开发当中资源的获取其实是间接通过R文件进行的,这个R文件就相当于是一个地址列表,存放着每个资源的地址

那么如何快速高效的获取就是这篇文章要分析的问题

假设我们有一个图片资源叫btn_bg

那么将一个按钮背景设置为这个图片的方式就是

btn.setBackgroundResource(R.drawable.btn_bg);

这里的R.drawable.btn_bg就是获取图片

但问题来了,这个获取图片的方式是通过对象名获取的,获取一两个可以这么处理

那么如果是多个图片要设置到多个按钮的话

例如按钮的id分别是btn_0,btn_1,btn_2,btn_3,btn_4

图片是btn_bg_0,btn_bg_1,btn_bg_2,btn_bg_4,btn_bg_4

很容易可以想到就是把按钮和图片都弄成List,然后循环

但是问题又来了,这个按钮要弄成List,就得每一个都findViewById

首先要声明两个List

List btns = new ArrayList(){ {

add((Button) findViewById(R.id.btn_0));

add((Button) findViewById(R.id.btn_1));

add((Button) findViewById(R.id.btn_2));

add((Button) findViewById(R.id.btn_3));

add((Button) findViewById(R.id.btn_4));

}};

List btn_bgs = new ArrayList(){ {

add(R.drawable.btn_bg_0);

add(R.drawable.btn_bg_1);

add(R.drawable.btn_bg_2);

add(R.drawable.btn_bg_3);

add(R.drawable.btn_bg_4);

}};

然后用的时候这样用

for (int i = 0; i < 5; i ++) btns.get(i).setBackgroundResource(btn_bgs.get(i));

看似已经很方便了,可是这里只有5个而且还是固定的内容,如果是数量一多的话,再内容如果是变化的,不是事先确定好的那该如何实现

看到这里可能有人会想了,这里的R.id.和R.drawable.是固定的,如果能否用字符串的"R.id.btn_0"去获取静态对象的R.id.btn_0,那可玩性就高多了

所以本文章的重点就在于如何用String去获取Object

看我写法

List btns = new ArrayList(){ {

try {

for (int i = 0; i < 5; i ++)

add((Button) findViewById((int) R.id.class.getDeclaredField("btn_" + i).get(R.id.class)));

} catch (Exception e) {

// TODO: handle exception

Log.i("MainActivity", e.toString());

}

}};

List btn_bgs = new ArrayList(){ {

try {

for (int i = 0; i < 5; i ++)

add((int) R.drawable.class.getDeclaredField("btn_bg_" + i).get(R.drawable.class));

} catch (Exception e) {

// TODO: handle exception

Log.i("MainActivity", e.toString());

}

}};

使用上还是一样,就是声明的时候变化了,注意这里用了一句关键代码

(int) R.id.class.getDeclaredField("btn_" + i).get(R.id.class))

在使用这句话的时候需要加入异常, 因为用String变量去找对象的属性有可能会出现找不到的情况,只要发现报错信息是java.lang.NoSuchFieldException: xxx一看就知道是找不到名为xxx的属性

那这句关键代码该如何灵活变换呢,其实很简单,这里出现两次的R.id.class,根据你要获取的对象换成对应的类即可

再一个就是getDeclaredField方法里面的内容,这里面的内容位String类型,上面的例子是有规律的01234,所以很容易循环出来

有人会问了,如果是不规律的情况怎么办,如果不规律的话那就直接用一个String[]数组把变量放进去,然后循环,以后如果有变化只要改变数组即可,一劳永逸

也可以把这里面的内容通过参数传进来,传什么进来他就可以获取什么,只要能获取得到的话,这里可发挥的空间就很大了,对应的最前面要加上强制类型转换

整个思路大概就这样,主要一个思想就是只要是通过字符串去获取属性的情况都可以采用这个方法获取.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AttributeError: module ‘numpy‘ has no attribute ‘int‘.

解决方法 降低numpy版本 numpy 1.22 修改源代码 参考 [1] 【已解决】AttributeError: module ‘numpy‘ has no attribute ‘int‘. [2] AttributeError: module numpy has no attribute int .报错解决方案

Java字段和属性

属性和字段区别&#xff1a; Java中的属性(property)&#xff0c;通常可以理解为get和set方法。更形象的说就是&#xff1a;属性是对字段的封装&#xff0c;供外部访问。 而字段(field)&#xff0c;通常叫做“类成员”&#xff0c;或 "类成员变量”&#xff0c;有时也叫“…

java我现在不懂看不懂,看都看不懂,难道我与Java无缘吗

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package VIP;public class Hero {private String name;private int Life;public void hero(String name,int Life){}public String getName() {return name;}public void setName(String name) {this.name name;}public int getLi…

Java反射 Class类

Class类的实例表示正在运行的Java应用程序中的类和接口。它是Java反射的基础&#xff0c;对任何一个类&#xff0c;首先产生一个Class对象&#xff0c;然后才通过class类获得其他的信息。 获取class类对象方式&#xff1a; 通过Object类提供的getClass()方法获得Class类对象。…

php数字从大到小生成,php输入几个数从大到小排序的案例

php输入几个数从大到小排序的案例发布时间&#xff1a;2020-10-28 11:53:20来源&#xff1a;亿速云阅读&#xff1a;66作者&#xff1a;小新php输入几个数从大到小排序的案例&#xff1f;这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小…

Java反射 Constructor类

Java反射 Constructor类 Java通过反射可以获取构造方法&#xff0c;和使用构造方法创造对象。 在网上找了一个比较好理解的例子来弄清楚Constructor类。 public Constructor getConstructor()// 公共构造方法对象 public Constructor[] getConstructors()//所有公共构造方法…

mysql hammerdb,[料理佳餚] 用 HammerDB 來執行資料庫 TPC-C 效能量測

TPC-C 模擬的情境TPC-C 模擬的情境是一個大型的商品批發商&#xff0c;擁有若干個倉庫&#xff0c;每個倉庫擁有 100000 件商品庫存、負責為 10 個地區供貨&#xff0c;每個地區服務 3000 名客戶&#xff0c;每名客戶平均一筆訂單有 10 項商品&#xff0c;所有訂單中約 1% 在其…

使用Linux进行c或c++编程

使用Linux进行C或c语言编程 1.创建名为 HelloWorld 的 c 或者 c 文件 vim HelloWorld.c vim Helloworld.cpp2.然后就进入文本编辑界面 输入i&#xff0c;进入编辑模式。写代码。按esc键&#xff0c;进入命令模式&#xff0c;输入:wq保存并退出文本编辑器。然后可以看见对应位…

如何用php写表单中的年月日,php写的日历程序 - adamboy的个人页面 - OSCHINA - 中文开源技术交流社区...

$weekArr array(Sun,Mon,Tue,Wed,Thu,Fri,Sat);//获取空格&#xff1a;//echo date("D",strtotime("2012-02-07"));function getSpace($month,$year){global $weekArr;if(!$year){$year date("Y");}$firstDay date("D",strtotime($…

Java反射 field

Java反射 field 获取字节码文件对象 Class c Class.forName(“fieldtest.Student”); 通过无参构造方法创建对象obj Constructor con c.getConstructor(); Object obj con.newInstance(); 通过成员变量名,获取单个的成员变量 Field nameField c.getField("name"…

mysql5.7循环,python3.4用循环往mysql5.7中写数据并输出的实现方法

python3.4用循环往mysql5.7中写数据并输出的实现方法来源&#xff1a;中文源码网 浏览&#xff1a; 次 日期&#xff1a;2018年9月2日python3.4用循环往mysql5.7中写数据并输出的实现方法 如下所示&#xff1a;#!/usr/bin/env python# -*- coding:utf-8 -*-# __author__ …

java反射 Method

java反射 Method 获取字节码文件对象 Class c Class.forName("fieldtest.Student");通过无参构造方法创建对象obj Constructor con c.getConstructor(); Object obj con.newInstance();Method m1 c.getMethod(“study”);获取study方法 m1.invoke(obj);使用obj对…

axure 鼠标变成手,Axure教程|鼠标移入移出自动显示与隐藏三级菜单

前几天因工作需要做一个鼠标移入显示隐藏菜单&#xff0c;鼠标移出自动隐藏菜单&#xff0c;做的时候觉得没有什么问题&#xff0c;做完后预览就发现一个很严重的问题&#xff0c;就是鼠标移出一级菜单向二级菜单时二级菜单不显示&#xff0c;或者二级菜单显示三级菜单不显示。…

java与平台无关的原因

Java字节码 Java源程序&#xff08;.java&#xff09;要先编译成与平台无关的字节码文件(.class)&#xff0c;然后字节码文件再解释成机器码运行。解释是通过Java虚拟机来执行的。 java要运行要经过如下步骤 ① Java源文件—->编译器&#xff08;工具&#xff09;—->…

php websocket应用实例,php使用websocket示例详解

下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分&#xff0c;这个部分在 node 中可以十分轻松的完成&#xff0c;因为 node 提供的 net 模块已经对 socket 套接字做了封装处理&#xff0c;开发者使用的时候只需要考虑数据的交互而不用处理连接的建立…

Java集合 Collection

Jdk提供了一些特殊的类&#xff0c;用来保存数量不确定的对象&#xff0c;存储任意类型对象&#xff0c;长度可变。这些类统称为集合。 集合类位于Java.util包中&#xff0c;按存储结构分为Collection单列集合和Map双列集合。 Collection是单列集合的根接口&#xff0c;有两个…

java basic data type,java基本数据类型--Basic Datatypes

Variables are nothing but reserved memory locations to store values. This means that when you create a variable you reserve some space in the memory.---说的好有道理Based on the data type of a variable, the operating system allocates memory and decides what…

Java final修饰符的作用,Java中的final修饰符

1.什么时候可以选择final修饰符如果想让一个类不被其他类继承&#xff0c;不允许在有子类&#xff0c;这时候就要考虑用到final来修饰。2.用final修饰的类首先大家要明白&#xff0c;用final修饰的类是不能被继承的&#xff0c;下面来看一个错误案例。eg&#xff1a;final clas…

Java基础 HashMap的添加 修改 遍历 Map.Entry Map.entrySet()的使用及实例

Java Map Map中不能包含相同的键&#xff0c;每个键只能映射一个值。 HashMap&#xff1a;并不能保证它的元素的顺序&#xff0c;元素加入散列映射的顺序并不一定是它们被迭代方法读出的顺序。 Map.Entry Map.Entry 是Map中的一个接口&#xff0c;他的用途是表示一个映射项…

adminer.php下载,Adminer.php

Adminer.php就是原来的phpMinAdmin&#xff0c;这是用PHP编写的数据库管理工具&#xff0c;支持mysql、mariadb、postgresql、sqlite、MS SQL、Oracle等多种数据库&#xff0c;虽然是一个源码&#xff0c;但是可以使用用户们和密码直接连接到数据库的服务器&#xff0c;既可以对…