Android Question How to test if object variable is an Activity?

qsrtech

Active Member
Licensed User
I thought

B4X:
if obj is activity then
else
end if
but it doesn't work. Any other way to test if "obj" is an activity?

EDIT:

For now I've resorted to using a try/catch/finally until a better way is established
 
Last edited:

qsrtech

Active Member
Licensed User
hmmm. idk if I did something wrong but the activity is coming up as "java.lang.Class"
 

Erel

Administrator
Staff member
Licensed User
You can use this code:
B4X:
Sub IsActivity(obj As Object) As Boolean
   If Not(obj Is Panel) Then Return False
   Dim jo As JavaObject = obj
   Dim parent As Object = jo.RunMethod("getParent", Null)
   Return parent <> Null And (GetType(parent) = "android.widget.FrameLayout" Or _
     GetType(parent) = "anywheresoftware.b4a.objects.IME$ExtendedBALayout")
End Sub
 

LucaMs

Expert
Licensed User
You can use this code:
B4X:
Sub IsActivity(obj As Object) As Boolean
   If Not(obj Is Panel) Then Return False
   Dim jo As JavaObject = obj
   Dim parent As Object = jo.RunMethod("getParent", Null)
   Return parent <> Null And (GetType(parent) = "android.widget.FrameLayout" Or _
     GetType(parent) = "anywheresoftware.b4a.objects.IME$ExtendedBALayout")
End Sub

This means that the Module Scale should be updated, given that my answer is part of it ;)
 

LucaMs

Expert
Licensed User
Erel, my obj is the @qsrtech's obj :)

and in Module Scale there is:
B4X:
Public Sub IsActivity(v As View) As Boolean
    Dim obj As Object
    obj = GetParent(v)
    If GetType(obj) = "android.widget.FrameLayout" Then
        Return True
    Else
        Return False
    End If
End Sub
 

LucaMs

Expert
Licensed User
Well I'm lost, and I can say: "luckily" :D

because you can use:
IsActivity(AnyDeclaredView)

but you can not use:
IsActivity(SecondActivity)
where SecondActivity should be an activity object, but it is only a class!

Please, do not answer or I will be forced to go to study Android + Java + Eclipse and then seek a mental hospital still open :p
 

LucaMs

Expert
Licensed User
Well, if obj (#1) is an activity object, "is activity" works.

B4X:
Sub Activity_Create(FirstTime As Boolean)
    pnl.Initialize("")
    Activity.AddView(pnl, 0, 0, 50dip, 50dip)
  
    Dim Parent As Object = GetParent(pnl)
  
    If Parent Is Activity Then
        Log("Yes")
    Else
        Log("No")
    End If

End Sub
B4X:
Sub GetParent(v As View) As Object
    Dim jobj = v As JavaObject
    Return jobj.RunMethod("getParent", Null)
End Sub
 

qsrtech

Active Member
Licensed User
Well, if obj (#1) is an activity object, "is activity" works.

B4X:
Sub Activity_Create(FirstTime As Boolean)
    pnl.Initialize("")
    Activity.AddView(pnl, 0, 0, 50dip, 50dip)
 
    Dim Parent As Object = GetParent(pnl)
 
    If Parent Is Activity Then
        Log("Yes")
    Else
        Log("No")
    End If

End Sub
B4X:
Sub GetParent(v As View) As Object
    Dim jobj = v As JavaObject
    Return jobj.RunMethod("getParent", Null)
End Sub
I think it's because the parent is the actual activity you are calling it in. I suspect it won't work if the "parent" is from another activity. Anyway, i'm moving away from using multiple activities within in an app. I mainly needed this piece of code temporarily while testing. I would encourage others to do the same, especially to make your app more ready for other platforms. Another benefit is you can make use of a drawer much easier. Now if we could only get a template feature it would sure help in the process. Btw, how's things going with you? You probably noticed i was absent for quite a while. B4i kinda pulled me back in ;)
 

LucaMs

Expert
Licensed User
The problem is that I have already forgotten a lot 'of things :D.

When you use "Me" or an Activity name, for example StartActivity(...), the parameter is a class name, not an object, instance of an Activity.

You can use another Activity but obj must "contain" an Activity, not its class name.

I think that rarely you can use one Activity only, without going crazy with dozens of views and panels.

Btw, how's things going with you? You probably noticed i was absent for quite a while. B4i kinda pulled me back in
I should answer with a not nice word, like sht, but I can't :p


So, welcome back :)
 

qsrtech

Active Member
Licensed User
:D
I think that rarely you can use one Activity only, without going crazy with dozens of views and panels:p

So, welcome back :)
Actually it's quite easy and more flexible. You simply convert your activity to a class and have a panel within that class that you load your layout into. I'll post a skeleton class when i get to my comp. In your main activity you simply handle the showing/hiding of the form classes. It's basically how you need to do it in b4i so it's better to do it in b4a as well. Another benefit is you can create multi windows a lot easier. A good example would be spreadsheet pages.

I think i'll create a navigation class like the one in b4i to handle all the "page" stuff in b4a. Then it's just a matter of a few conditionals and b4a apps are pretty much ready for b4i. There's a great tool to significantly help convert b4a layouts to b4i. (Just wish it was a more drag and drop tool vs cmd line) Of course android is far superior to ios but unfortunately with around 30% of the market share i have no choice but to support it.

Thanks :)

Edit: I should add with classes vs activities, you don't have all the issues of recreating you activity everytime you switch between them (and saving state)
 

LucaMs

Expert
Licensed User
Good, become a B4i expert, so when I have released an Android app (2059 :D), I will ask you to convert it to iOS.

In your main activity you simply handle the showing/hiding of the form classes
... and write in the Main Activity all the code needed for "each Activity", including events. Uhm... mumble mumble :rolleyes:
 

qsrtech

Active Member
Licensed User
Good, become a B4i expert, so when I have released an Android app (2059 :D), I will ask you to convert it to iOS.



... and write in the Main Activity all the code needed for "each Activity", including events. Uhm... mumble mumble :rolleyes:
No silly, all the events are handled within the class. You only call back the main activity if you need to, probably not much different than what you do now with inter-activity stuff.
 

LucaMs

Expert
Licensed User
Sorry, I can not see the benefits.

Let's see if I understood.

You have the Activity Main, in which you declare x number of classes, we could call them "Activity classes".

Then, at any given time, you use that class and show its layout within a panel.

The class is generic, it does not contain specific code, so all the app code is contained in the Main Activity.

Is it so?
 
Top