Android Reflection zugriff auf setFocusableInTouchMode

Trolok

Mitglied
Ich möchte in meiner App alle Buttons per Reflection focusierbar machen, jedoch kommt immer der Fehler, dass die Methode setFocusableInTouchMode nicht existiert.

Java:
[...]
Class id_class = MainActivity.class;    	
Field[] id_list= id_class.getDeclaredFields(); 
for(int i=0;i<id_list.length;i++){
    		try {
				Object view_object=id_list[i]; 											
				if(((Field) view_object).getGenericType() == Button.class){						
					Method tmeth=view_object.getClass().getDeclaredMethod("setFocusableInTouchMode", Boolean.class);	
					tmeth.setAccessible(true);
					tmeth.invoke(view_object,true);			
					 
				}
[...]

der Fehler (NoSuchMethodException) wird durch die 8te Zeile verursacht. Kann es sein, dass ich Reflection nicht richtig verstanden habe, oder liegt es an der Platform?
 
Warum Reflection? Du hast doch das Objekt bzw. eine Referenz darauf.
Einfach mit
Code:
instanceof Button
prüfen, ob es sich um ein Button Objekt handelt. Dann nach Button casten und daran die Methode aufrufen.
Keine Ahnung ob Du Refection falsch verstanden hast, aber Du wendest sie auf jeden Fall nicht richti an.
 
gehört die Methode zu einer Super-Klasse?

getDeclaredMethod() sucht glaube ich tatsächlich in der Klasse deklarierte/ überschriebene Methoden,

getMethod() macht mehr, findet dafür nur public Methoden oder so, testen

Let C be the class represented by this object:

- C is searched for any matching methods. If no matching method is found, the algorithm of step 1 is invoked recursively on the superclass of C.
- If no method was found in step 1 above, the superinterfaces of C are searched for a matching method. If any such method is found, it is reflected.
Class (Java 2 Platform SE 5.0)

edit:
ach und zum Thema Reflection falsch anwenden:
view_object ist hier ein Field, ein Objekt der Klasse Field, kein Button

Field (Java 2 Platform SE 5.0)

wenn man ein MainActivity-Objekt hätte, im Code nicht zu sehen, könnte man den Wert dieses Fields im Objekt holen,
aber die anderen Wege mit instanceof usw. sind besser, falls praktikabel,

vielleicht mit Field.get() das Objekt holen, und dann erst damit arbeiten können
 
Zuletzt bearbeitet von einem Moderator:
Also im Quelltext von java.awt.Button konnte ich die Methode tatsächlich nicht finden. Evtl. in einer seiner Oberklassen? Habe nicht weiter gesucht. Und dann könnte ich mir noch vorstellen, dass diese Methode einen primitiven boolean als Parameter erwartet und keinen Wrapper. Wenn das so ist, wäre Der Klassen-Pararmeter "Boolean.class" in "boolean.class" zu ändern.

Und auch, wenn Du es nicht hören willst: Mach es ohne Reflection! Ich bin sicher, dass es irgendwie anders geht. Lies lieber noch ein bischen Doku, anstatt so einen dirty Hack zu implementieren.

[EDIT]Merke gerade, es geht hier um Android. Da ist der Button wohl gar kein java.awt.Button? Egal, schaue im Zweifel im Source-Code des Android-Buttons nach. Meine Aussagen sind übertragbar.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
@asdfghjl
einfach casten funktioniert nicht, ClassCast Exception

@SlaterB
Danke dir mit "view_object.getClass()" hast du natürlich recht, ich hatte vorher immer android.View.view.class (in dieser Klasse ist die Methode)da kam der selbe Fehler raus, also ist mir gar nicht aufgefallen, dass ich noch einen Fehler reinbaue.

So nun zur Auflösung, mein Fehler war viel simpler (und um längen peinlicher) es sollte boolean.class und nicht Boolean.class heißen 😳 so wie es Ausschaut läuft das Programm nun.
 

Neue Themen


Zurück
Oben