android獲取控制元件的幾種方法
layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:background="@color/colorPrimary" android:layout_height="wrap_content"> <TextView android:id="@+id/item_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="25sp" /> </RelativeLayout>
0x01 findViewById
private TextView item_tv; item_tv = findViewById(R.id.item_tv); item_tv.setText("text1");
0x02 getResources().getIdentifier()
int viewId = getResources().getIdentifier("item_tv", "id", getPackageName()); TextView textView =findViewById(viewId); textView.setText("text2");
0x03 getField()
try { Field field = R.id.class.getField("item_tv"); TextView textView = findViewById(field.getInt(null)); textView.setText("text3"); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }
0x04 通過反射
java反射機制 獲取類的方式:(1)class.forName("類名"),(2)類名().getClass(),(3)類名.class; Constructor類: getConstuctor()返回class的建構函式; getConstructors()返回class類的所有構造方法; getDelaredConstructor()返回class類或介面指定的建構函式; getDelaredConstructors()返回所有class類或介面指定的建構函式; getEnclosingConstructor()返回class類的構造方法中的一個本地或匿名類; getModifiers()返回物件的java修飾符; getName()以字串的形式返回構造方法的名稱; newInstance()例項化物件; getDeclaredFields()獲取本類的全部屬性; getMethod()獲取類中的方法物件; Field類: 獲取反射欄位的方式:getDeclaredField(),getFields(); getName()獲取欄位名; getType()獲取欄位型別; get()獲取欄位的值; set()設定欄位的值; try { Class stuClass = Class.forName("com.example.homepage.activity.HH"); Field file = stuClass.getDeclaredField("item_tv"); // 通過反射獲取item_tv物件 file.setAccessible(true); TextView textView = (TextView) file.get(this); // 獲取textView例項 textView.setText("text4"); file.set(this,textView); } catch (Exception e) { e.printStackTrace(); } }
code
ofollow,noindex">code
others
一些測試程式碼
try { //Field field = R.id.class.getField("header_tv"); Class stuClass = Class.forName("com.jwenfeng.library.pulltorefresh.view.HeadRefreshView"); //Class stuClass = Class.forName("com.jwenfeng.library.pulltorefresh.PullToRefreshLayout"); //Field f = stuClass.getDeclaredField("header_tv"); //f.setAccessible(true); // //TextView textView = findViewById(f.getInt(null)); //Log.e("tea",textView.getText().toString()); //textView.setText("zezeze"); //HeadRefreshView view = (HeadRefreshView) stuClass.newInstance(); //Field[] fieldArray = stuClass.getFields(); // 不包括私有引數 //Field[] fieldArray = stuClass.getDeclaredFields(); //私有引數 //for(Field f : fieldArray){ //Log.e("tea", String.valueOf(f)); //} Field file = stuClass.getDeclaredField("tv"); file.setAccessible(true); HeadRefreshView view = new HeadRefreshView(this); TextView nameStr = (TextView) file.get(view); Log.e("tea", nameStr.getText().toString()); nameStr.setText("tea9"); Method m2 = stuClass.getDeclaredMethod("getView"); View view1 = (View) m2.invoke(view); TextView textView1 = view1.findViewById(R.id.header_tv); textView1.setVisibility(View.GONE); textView1.setText("tea8"); file.set(view1, textView1); }catch (Exception e) { e.printStackTrace(); Log.e("tea", "錯誤了"); }
LINKS
リフレクションを使って文字列からリソースIDを取得する JAVA反射 Java Reflection(反射機制)詳解 Java 反射 使用總結 關於Android中根據ID名動態獲取資源的兩個方法 Android利用資源名稱獲取其ID(一)--->getIdentifier()