Java 通过反射或其他方式查找我的按钮字段名称
我有两个类——我的主要Android活动类和我的反射类。我正在使用Android Studio 在我的主要活动课上,我有一个按钮。我想这样做,当我按下这个按钮时,我应该得到在strings.xml中定义的按钮的名称 我不想使用getText(),所以不要告诉我使用它。我想使用反射或其他好方法 在我的reflection类中,我使用reflection获取我在主activity类中定义的字段,并将其放入字符串变量中。当我用toast显示这个值时,它给了我一个null值 我的反思课Java 通过反射或其他方式查找我的按钮字段名称,java,android,Java,Android,我有两个类——我的主要Android活动类和我的反射类。我正在使用Android Studio 在我的主要活动课上,我有一个按钮。我想这样做,当我按下这个按钮时,我应该得到在strings.xml中定义的按钮的名称 我不想使用getText(),所以不要告诉我使用它。我想使用反射或其他好方法 在我的reflection类中,我使用reflection获取我在主activity类中定义的字段,并将其放入字符串变量中。当我用toast显示这个值时,它给了我一个null值 我的反思课 public c
public class Reflection extends MyActivity
static public String Value;
public static void Cool() {
MyActivity myActivity=new MyActivity(); // Creating Android Main Activity Class Object
try {
Field field=myActivity.getClass().getField("btnFIRST"); //btnFirst Field Which i Defined In Android Main Activity Class
field.setAccessible(true);
Value=(String)field.get(myActivity);
}
catch (Exception E){
E.printStackTrace();
}
}
}
public class MyActivity extends Activity {
Reflection ref; // Here I Am Creating My Reflection Class Object
Button btnFIRST;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
btnFIRST = (Button) findViewById(R.id.btnFIRST);
ref=new Reflection(); // Reflection Class New Object
ref.Cool(); // Here I Am Calling My Cool Method Which Define In My Reflection Class
btnFIRST.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MyActivity.this, "Found Button Name="+ref.Value, Toast.LENGTH_LONG).show();
}
});
}
}
Android主活动类
public class Reflection extends MyActivity
static public String Value;
public static void Cool() {
MyActivity myActivity=new MyActivity(); // Creating Android Main Activity Class Object
try {
Field field=myActivity.getClass().getField("btnFIRST"); //btnFirst Field Which i Defined In Android Main Activity Class
field.setAccessible(true);
Value=(String)field.get(myActivity);
}
catch (Exception E){
E.printStackTrace();
}
}
}
public class MyActivity extends Activity {
Reflection ref; // Here I Am Creating My Reflection Class Object
Button btnFIRST;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
btnFIRST = (Button) findViewById(R.id.btnFIRST);
ref=new Reflection(); // Reflection Class New Object
ref.Cool(); // Here I Am Calling My Cool Method Which Define In My Reflection Class
btnFIRST.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MyActivity.this, "Found Button Name="+ref.Value, Toast.LENGTH_LONG).show();
}
});
}
}
请参见此处:+ref.Value
我想打印我的按钮值名称,它是strings.xml中定义的“(单击)”。但我得到的是一个空值
我应该得到输出“Found Button Name=Click”。当您构造
MainActivity
的实例时,该实例的btnFIRST
值为null
。这是因为btnFIRST
仅在onCreate()
方法中分配,该方法从未在该实例上调用
您可能认为在尝试访问该字段之前只需调用onCreate()
,但这也行不通:您将得到一个异常。这是因为MainActivity
的实例未正确设置(例如,它没有正确的上下文
,没有Widnow
,等等),因此无法扩大布局。Android操作系统负责进行此设置;这不是你自己能做的。一般来说,通过构造函数自己构造活动总是一个坏主意
也就是说,我完全找不到任何理由,你需要使用反射来获取这个按钮的文本。除非您能给我们一个令人信服的理由说明为什么需要这样做,您应该只使用getText()
或者,如果你知道字符串资源ID,你可以在你的活动中调用
getString(…)
。你知道类是什么吗?类是什么意思…….K谢谢Karakuri,但没有其他方法可以获取视图名称假设我正在使用语音启用应用程序,在我的应用程序中有20个视图(如文本框、按钮、编辑框bala bala bala)我想按名称获取所有视图,然后按名称调用就可以轻松地放置100个视图……gettext()方法有多相同?如果不知道您实际想做什么,我无法提供您多少建议。可以尝试遍历视图层次结构,并对任何属于TextView
实例的对象调用getText()。