Android Question How check item TYPE in list objects.

Tayfur

Well-Known Member
Licensed User
Longtime User
Hello;

I want learn TYPE in list items .
How can i do?


B4X:
'Obj_names  as Şist
'Obj_names >>0>> Panel
'Obj_names >>1>> EditText
'Obj_names >>2>> Spinner
'Obj_names >>2>> My_costum_class(CustomView) ??? important

Sub Object_Connected(Obj_names As List)
    For i=0 To Obj_names.size-1
        If Obj_names.Get(i) Is Panel Then Log(i&"Panel")
        If Obj_names.Get(i) Is View Then Log(i&"view")
        '.... some code
       
     Next
End Sub
 

DonManfred

Expert
Licensed User
Longtime User
What is the result when you log the type?
B4X:
Log(GetType(Obj_names.Get(i)))
 
Upvote 0

Tayfur

Well-Known Member
Licensed User
Longtime User
What is the result when you log the type?
B4X:
Log(GetType(Obj_names.Get(i)))
thanks, I understand for std object Panel/Edit/spiiner...

I want use xxx.LEFT for all objects.
Only 1 problem my own class/lib or external lib. (extreal lib/class has get/set "LEFT")
How can I control "My_costum_class.Left" or other customviews


B4X:
Sub Object_Connected(Obj_names As List)
   
'Obj_names >>0>> Panel
'Obj_names >>1>> EditText
'Obj_names >>2>> Spinner
'Obj_names >>2>> My_costum_class(CustomView)

Sub Object_Connected(Obj_names As List)
    Dim x1 As Panel
    Dim x2 As EditText
    Dim x3 As My_costum_class
    For i=0 To Obj_names.size-1
        If GetType(Obj_names.Get(i))="Panel" Then 
                x1=Obj_names.Get(i)
                x1.Left=100dip
        End If
        If GetType(Obj_names.Get(i))="???????" Then '<< My_costum_class(CustomView)
                x3=Obj_names.Get(i)
                x3.Left=200dip
        End If
    Next
End Sub
End Sub
 
Upvote 0

Roycefer

Well-Known Member
Licensed User
Longtime User
You can use Reflection but you better be sure that every class you use it with has a "setLeft" method:
B4X:
Sub SetLeftPropertyReflection(o as Object, l as Double)
    Dim r as Reflector
    Dim arg as String = l
    r.Target = o
    r.RunMethod2("setLeft", arg, "java.lang.Double")
End Sub

You can also use JavaObject with the same considerations:
B4X:
Sub SetLeftPropertyJO(o as Object, l as Double)
    Dim jo as JavaObject = o
    jo.RunMethod("setLeft", Array(l))
End Sub

None of this code is tested, so beware.
 
Upvote 0

Tayfur

Well-Known Member
Licensed User
Longtime User
You can use Reflection but you better be sure that every class you use it with has a "setLeft" method:
B4X:
Sub SetLeftPropertyReflection(o as Object, l as Double)
    Dim r as Reflector
    Dim arg as String = l
    r.Target = o
    r.RunMethod2("setLeft", arg, "java.lang.Double")
End Sub

You can also use JavaObject with the same considerations:
B4X:
Sub SetLeftPropertyJO(o as Object, l as Double)
    Dim jo as JavaObject = o
    jo.RunMethod("setLeft", Array(l))
End Sub

None of this code is tested, so beware.


thank you
I will test it.
 
Upvote 0

Tayfur

Well-Known Member
Licensed User
Longtime User
You can use Reflection but you better be sure that every class you use it with has a "setLeft" method:
B4X:
Sub SetLeftPropertyReflection(o as Object, l as Double)
    Dim r as Reflector
    Dim arg as String = l
    r.Target = o
    r.RunMethod2("setLeft", arg, "java.lang.Double")
End Sub

You can also use JavaObject with the same considerations:
B4X:
Sub SetLeftPropertyJO(o as Object, l as Double)
    Dim jo as JavaObject = o
    jo.RunMethod("setLeft", Array(l))
End Sub

None of this code is tested, so beware.


Hello @Roycefer ;
I did some refletions for get properties.

I try all variable
Left, left, getleft, getLeft,_Left,_left...

I recived some error.
how is check properties for "LEFT"

B4X:
Sub setPanel_Connected(Panel_names As List)
    If Con_panel.IsInitialized=False Then Con_panel.Initialize
    Con_panel.Clear
    Con_panel=Panel_names
    Log("-------------")
    Dim r As Reflector
    Dim x As Object
        For i=0 To Panel_names.Size-1
           
        r.Target = Panel_names.Get(i)
        x=r.GetPublicField("_left")
        'r.GetPublicField("getleft"))
        Log(r.GetPublicField("getLeft"))
   
    Next
   
    'Sub GetProperty(obj As Object, Property As String) As Object
  'Dim r As Reflector
  'r.Target = obj
  'Return r.GetPublicField(Property)
'End Sub
   
End Sub


B4X:
Installing file.
PackageAdded: package:b4a.example
** Activity (main) Create, isFirst = true **
intakizeeeeeeeeeeeeee
tayfur)
******desinger create******
intalize
******desinger create******
** Activity (main) Resume **

-256
loadied...
-------------
autohidemenu_setpanel_connected (B4A line: 698)
x=r.GetPublicField("_left")
java.lang.RuntimeException: java.lang.NoSuchFieldException: _left
    at anywheresoftware.b4a.agraham.reflection.Reflection.GetPublicField(Reflection.java:351)
    at b4a.example.autohidemenu._setpanel_connected(autohidemenu.java:2369)
    at b4a.example.main._customview1_loaded(main.java:593)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:187)
    at anywheresoftware.b4a.keywords.Common$5.run(Common.java:981)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at anywheresoftware.b4a.Msgbox.waitForMessage(Msgbox.java:198)
    at anywheresoftware.b4a.Msgbox.debugWait(Msgbox.java:157)
    at anywheresoftware.b4a.debug.Debug.wait(Debug.java:214)
    at anywheresoftware.b4a.debug.Debug.reachBP(Debug.java:261)
    at anywheresoftware.b4a.debug.Debug.ShouldStop(Debug.java:233)
    at b4a.example.helper._load(helper.java:823)
    at b4a.example.helper._setcornerlogo_p(helper.java:1474)
    at b4a.example.main._customview2_intelized(main.java:777)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:187)
    at anywheresoftware.b4a.keywords.Common$5.run(Common.java:981)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4921)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoSuchFieldException: _left
    at java.lang.Class.getField(Class.java:787)
    at anywheresoftware.b4a.agraham.reflection.Reflection.GetPublicField(Reflection.java:347)
    ... 29 more
java.lang.RuntimeException: java.lang.NoSuchFieldException: _left
 
Upvote 0

Roycefer

Well-Known Member
Licensed User
Longtime User
This is for a class you wrote, right? Go into your project folder and navigate to Objects/src and find the .java file for your class. Open it with any text editor (like Notepad). You'll be able to see the names for your fields and methods.
 
Upvote 0

Tayfur

Well-Known Member
Licensed User
Longtime User
This is for a class you wrote, right? Go into your project folder and navigate to Objects/src and find the .java file for your class. Open it with any text editor (like Notepad). You'll be able to see the names for your fields and methods.

My code for cheking and Log records on ERROR
Sorry I cant check it

B4X:
Sub setPanel_Connected(Panel_names As List)
    If Con_panel.IsInitialized=False Then Con_panel.Initialize
    Con_panel.Clear
    Con_panel=Panel_names
   
    Log("-------------")
    Dim r As Reflector
    Dim x As Object
        For i=0 To Panel_names.Size-1
            Log("-------"&i)
            'If SubExists(Panel_names.Get(i),"left") Then
            'CallSub(obj, "get" & Property)
            'Log(i&"--ok")
            'End If
            Log ( GetType(Panel_names.Get(i)))
        r.Target = Panel_names.Get(i)
        ' r.Target = TextView
           'If i=2 Then
            Log(r.GetContext)
            'r.SetField("setLeft", 100, "java.lang.int")
            Log(i&"-----")
            r.RunMethod2("setLeft", 100, "java.lang.int")
           
        'End If
        'r.GetPublicField("getleft"))
        'Log(r.GetPublicField("getLeft"))
   
    Next
   
End Sub

LOG ERROR


B4X:
autohidemenu_setpanel_connected (B4A line: 709)
r.RunMethod2("setLeft", 100, "java.lang.int")
java.lang.NoSuchMethodException: setLeft [int]
    at java.lang.Class.getConstructorOrMethod(Class.java:460)
    at java.lang.Class.getDeclaredMethod(Class.java:685)
    at anywheresoftware.b4a.agraham.reflection.Reflection.runmethod(Reflection.java:214)
    at anywheresoftware.b4a.agraham.reflection.Reflection.RunMethod2(Reflection.java:817)
    at b4a.example.autohidemenu._setpanel_connected(autohidemenu.java:2381)
    at b4a.example.main._customview1_loaded(main.java:590)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:187)
    at anywheresoftware.b4a.keywords.Common$5.run(Common.java:981)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4921)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)


AND this AUTO HIDE

B4X:
'----------------------------------
'gets or sets the LEFT coordiante
Sub setLeft(Left As Int)
    Ana_Panel.Left =Left
    Ana_Panel.Invalidate
End Sub

Sub getLeft As Int
    Return Ana_Panel.Left
End Sub

THİS MYCLASS for problem object

B4X:
public String  _setleft(int _left) throws Exception{
try {
        Debug.PushSubsStack("setLeft (autohidemenu) ","autohidemenu",3,ba,this,1002);
Debug.locals.put("Left", _left);
BA.debugLineNum = 1002;BA.debugLine="Sub setLeft(Left As Int)";
Debug.ShouldStop(512);
BA.debugLineNum = 1003;BA.debugLine="Ana_Panel.Left =Left";
Debug.ShouldStop(1024);
_ana_panel.setLeft(_left);
BA.debugLineNum = 1004;BA.debugLine="Ana_Panel.Invalidate";
Debug.ShouldStop(2048);
_ana_panel.Invalidate();
BA.debugLineNum = 1005;BA.debugLine="End Sub";
Debug.ShouldStop(4096);
return "";
}
catch (Exception e) {
            Debug.ErrorCaught(e);
            throw e;
        }
finally {
            Debug.PopSubsStack();
        }}
 
Upvote 0

Tayfur

Well-Known Member
Licensed User
Longtime User
This is for a class you wrote, right? Go into your project folder and navigate to Objects/src and find the .java file for your class. Open it with any text editor (like Notepad). You'll be able to see the names for your fields and methods.

thanks @Roycefer

how can check method name ? "_setleft" or "setleft" or "left" with reflection
for exp.

if r.checkmetod("_left") then .... else ....


under livnes codes worked own lib. thanks feedback.
B4X:
If i=2 Then
            Log(r.GetContext)
         
            r.RunMethod2("_setleft", 100, "java.lang.int")  '<<<<<<<<== ist work own my lib.
            Else
            Log(i&"-----")
            r.RunMethod2("setLeft", 100, "java.lang.int")  '<<<<< editext, spiiner, panel etc. std b4a objects.
            End If
 
Upvote 0

Roycefer

Well-Known Member
Licensed User
Longtime User
Try using JavaObject:
B4X:
Sub SetLeftPropertyJO(o as Object, newLeft as Int)
   Dim jo as JavaObject = o
   jo.RunMethod("_setleft", Array(newLeft))
End Sub

Note that this version is different from the one I used above; it uses "_setleft" instead of "setLeft".
 
Upvote 0

Roycefer

Well-Known Member
Licensed User
Longtime User
I think you can probably test for the presence of a method with this code:
B4X:
Sub SubExistsReflection(o as Object, SubName as String, ArgTypes() as String) as Boolean
    Dim r as Reflector
    r.Target = o
    Try
        Dim method as Object = r.GetMethod(SubName, ArgTypes)
        Return True
     Catch
        Return False
     End Try
End Sub

And then call it like so:
B4X:
Log("SubExists: " & SubExistsReflection(Con_panel, "_setleft", Array As String("java.lang.Integer")))

Again, untested. Beware.
 
Upvote 0

Tayfur

Well-Known Member
Licensed User
Longtime User
Try using JavaObject:
B4X:
Sub SetLeftPropertyJO(o as Object, newLeft as Int)
   Dim jo as JavaObject = o
   jo.RunMethod("_setleft", Array(newLeft))
End Sub

Note that this version is different from the one I used above; it uses "_setleft" instead of "setLeft".


sorry; your code dont work,
I tested like this. all results are FALSE

B4X:
If i=2 Then
            Log(r.GetContext)
            'r.SetField("setLeft", 100, "java.lang.int")
                Log("SubExists11: " & SubExistsReflection(Panel_names.Get(i), "_setmax", Array As String("java.lang.Integer"))) ' returned FALSE
                Log("SubExists21: " & SubExistsReflection(Panel_names.Get(i), "_setMax", Array As String("java.lang.Integer")))' returned FALSE
                Log("SubExists31: " & SubExistsReflection(Panel_names.Get(i), "setmax", Array As String("java.lang.Integer")))' returned FALSE
                Log("SubExists41: " & SubExistsReflection(Panel_names.Get(i), "setMax", Array As String("java.lang.Integer")))' returned FALSE
                r.RunMethod2("_setmax", 100, "java.lang.int") '----->> its code work
            Else
                Log(i&"-----")
                Log("SubExists1: " & SubExistsReflection(Panel_names.Get(i), "_setleft", Array As String("java.lang.Integer")))' returned FALSE
                Log("SubExists2: " & SubExistsReflection(Panel_names.Get(i), "_setLeft", Array As String("java.lang.Integer")))' returned FALSE
                Log("SubExists3: " & SubExistsReflection(Panel_names.Get(i), "setleft", Array As String("java.lang.Integer")))' returned FALSE
                Log("SubExists4: " & SubExistsReflection(Panel_names.Get(i), "setLeft", Array As String("java.lang.Integer")))' returned FALSE
            r.RunMethod2("setLeft", 100, "java.lang.int") '----->> its code work
           
            End If
 
Upvote 0

Tayfur

Well-Known Member
Licensed User
Longtime User
My pleasure.

I wirte 2 method for SET and GET values for only INTEGER values
Now codes is work. thanks again.


B4X:
Private Sub SubExistsReflectionSET(o As Object, SubName As String, ArgTypes() As String) As Boolean
    Dim r As Reflector
    r.Target = o
    Try
        Dim method As Object = r.GetMethod(SubName, ArgTypes)
        Log(method)
        Return True
     Catch
        Return False
     End Try
End Sub

Private Sub SubExistsReflectionGET(o As Object, SubName As String) As Boolean
    Dim r As Reflector
    r.Target = o
    Try
        Dim method As Object = r.RunMethod(SubName)'r.GetMethod(SubName)
        Log(method)
        Return True
     Catch
        Return False
     End Try
End Sub


B4X:
' bu fonksiyon b4a elementleri harici için left top vs değerlerini set eder
Private Sub Value_Set(obj As Object,Parameter As String, Value As Int)
    Dim r As Reflector
    Dim x As Object
    Dim prmt,prmt2 As String
    prmt=Parameter.ToUpperCase.SubString2(0,1).Trim&Parameter.ToLowerCase.SubString2(1,Parameter.Length).Trim
    prmt2=Parameter.ToLowerCase.Trim
  
    r.Target = obj
  
    If obj Is View Then 'Log("standar b4a nesenesi sonuç:view")
        '------ B4A standart object
      
        r.RunMethod2("set"& prmt, Value, "java.lang.int")  
    Else
        '----- özel nesne
        If SubExistsReflectionSET(obj, "_set"&prmt, Array As String("java.lang.int")) Then
            r.RunMethod2("_set"& prmt, Value, "java.lang.int")  
        Else
            '--------------
            If SubExistsReflectionSET(obj, "_set"&prmt2, Array As String("java.lang.int")) Then
                r.RunMethod2("_set"& prmt2, Value, "java.lang.int")  
            Else
                '--------------
                If SubExistsReflectionSET(obj, "set"&prmt, Array As String("java.lang.int")) Then
                    r.RunMethod2("set"& prmt, Value, "java.lang.int")  
                Else
                    '--------------
                    If SubExistsReflectionSET(obj, "set"&prmt2, Array As String("java.lang.int")) Then
                        r.RunMethod2("set"& prmt2, Value, "java.lang.int")                      
                    Else
                        LogColor("Error Parameter Setting:"&Parameter,Colors.red)
                        LogColor("Error Parameter Setting:"&r.GetContext,Colors.red)
                    End If  
                    '--------------
                End If  
                '--------------
            End If  
            '--------------
              
        End If
          
    End If
End Sub



'
Private Sub Value_Get(obj As Object,Parameter As String) As Int
    Dim r As Reflector
    Dim x As Int
    Dim prmt,prmt2 As String
    prmt=Parameter.ToUpperCase.SubString2(0,1).Trim&Parameter.ToLowerCase.SubString2(1,Parameter.Length).Trim
    prmt2=Parameter.ToLowerCase.Trim
  
    r.Target = obj
  
  
    If obj Is View Then 'Log("standar b4a nesenesi sonuç:view")
        '------ B4A standart object
        Return     r.RunMethod("get"& prmt)
    Else
        '----- special object
        If SubExistsReflectionGET(obj, "_get"&prmt) Then', Array As String("java.lang.int")) Then
            Return     r.RunMethod("_get"& prmt)', Value, "java.lang.int")  
        Else
            '--------------
            If SubExistsReflectionGET(obj, "_get"&prmt2) Then ', Array As String("java.lang.int")) Then
                Return     r.RunMethod("_get"& prmt2)', Value, "java.lang.int")  
            Else
                '--------------
                If SubExistsReflectionGET(obj, "get"&prmt) Then', Array As String("java.lang.int")) Then
                    Return     r.RunMethod("get"& prmt)', Value, "java.lang.int")  
                Else
                    '--------------
                    If SubExistsReflectionGET(obj, "get"&prmt2) Then', Array As String("java.lang.int")) Then
                        Return     r.RunMethod("get"& prmt2)', Value, "java.lang.int")                      
                    Else
                        LogColor("Error Parameter Setting:"&Parameter,Colors.red)
                        LogColor("Error Parameter Setting:"&r.GetContext,Colors.red)
                        Msgbox(Parameter&CRLF&r.GetContext, "Error Parameter Setting:")
                        Return     0
                    End If  
                    '--------------
                End If  
                '--------------
            End If  
            '--------------
              
        End If
          
    End If
End Sub
 
Upvote 0
Top