Java 通过反射或其他方式查找我的按钮字段名称

Java 通过反射或其他方式查找我的按钮字段名称,java,android,Java,Android,我有两个类——我的主要Android活动类和我的反射类。我正在使用Android Studio 在我的主要活动课上,我有一个按钮。我想这样做,当我按下这个按钮时,我应该得到在strings.xml中定义的按钮的名称 我不想使用getText(),所以不要告诉我使用它。我想使用反射或其他好方法 在我的reflection类中,我使用reflection获取我在主activity类中定义的字段,并将其放入字符串变量中。当我用toast显示这个值时,它给了我一个null值 我的反思课 public c

我有两个类——我的主要Android活动类和我的反射类。我正在使用Android Studio

在我的主要活动课上,我有一个按钮。我想这样做,当我按下这个按钮时,我应该得到在strings.xml中定义的按钮的名称

我不想使用getText(),所以不要告诉我使用它。我想使用反射或其他好方法

在我的reflection类中,我使用reflection获取我在主activity类中定义的字段,并将其放入字符串变量中。当我用toast显示这个值时,它给了我一个null

我的反思课

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()。