Italian Activity Sender

Teech

Member
Licensed User
Longtime User
Scusate la domanda che potrebbe essere banale, ma non ho trovato alcuna risposta.
Se ho ben capito tutto parte dalla Activity Main e poi è possibile lanciare altre Activity con StartActivity() o CallSubDelayed().
Dall'interno dell'Activity "lanciata" è possibile sapere quel'è l'Activity "lanciante"?

Dalla Activity Main eseguo:
StartActivity(Activity2)

In Activity2 è possibile fare una cosa del tipo:
B4X:
Sub Globals
    Private target As Object
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.Title="Title"
    Activity.LoadLayout("Layout")
    target=Me.Sender '<--- Qualcosa di simile
End Sub

Sub bt_Click
    CallSub2(target,"Sub",var) '<--- utilizzo di 'target'
End Sub

Se non esiste modo lo posto nei 'Wish', penso sia comodo.
 

LucaMs

Expert
Licensed User
Longtime User
E' una delle prime cose che cercai (quindi quasi due anni fa).

Più precisamente, cercai qualcosa tipo StartActivityForResult, per usare un'activity "secondaria" come fosse una dialog, e quindi con un risultato di ritorno.
[P.S. adesso ricordo un po' meglio: era per lanciare un'activity con barcode scanner e riceverne il codice letto].

No, non esiste; il semplice mezzuccio che utilizzai fu di creare, in ogni activity, una variabile globale da impostare prima della chiamata con l'oggetto chiamante (o forse era il nome dell'oggetto chiamante, ora non ricordo).
 
Last edited:

cimperia

Active Member
Licensed User
Longtime User
E' possibile utilizzando intent.

B4X:
  'Main activity
  Dim intent_ As Intent
  intent_.Initialize("", "")
  intent_.SetComponent(GetPackageName & "/.Activity2")

  intent_.PutExtra("CallingActivityName", "Main")
  StartActivity(intent_)

B4X:
'Activity2
Sub Activity_Create(FirstTime As Boolean)

  Dim StartingIntent As Intent
  StartingIntent=Activity.GetStartingIntent
  Log( StartingIntent.GetExtra("CallingActivityName"))
End Sub

B4X:
Sub GetPackageName As String
  Private r As Reflector
  Return r.GetStaticField("anywheresoftware.b4a.BA", "packageName")
End Sub

Edit: Forgot to post the code for GetPackageName
 
Last edited:

Teech

Member
Licensed User
Longtime User
Mi è chiarissimo il concetto, e la soluzione mi piace, ma ho difficoltà nella realizzazione.

Nella mia Activity (non la Main) ho le seguenti righe:
B4X:
Sub Activity_Create(FirstTime As Boolean)
    intent_.Initialize("", "")
    intent_.PutExtra("CallingActivityName", "CategoriesManager")
    ....
End Sub

Sub btAddCategory_Click
    edit_category=mCategories.CreateNew
    intent_.SetComponent(GetPackageName & "/.CategoryManager")
    If Not(edit_category=Null) Then CallSubDelayed2(intent_,"InsertCategory",edit_category)
End Sub

Quando però la Sub termina e viene lanciata la CallSubDelayed2 mi restituisce questo errore:
java.lang.RuntimeException: java.lang.ClassCastException: android.content.Intent cannot be cast to java.lang.String

Penso che il problema possa essere sul Manifest, ma sono un esordiente totale e non ho idea di come risolvere.

EDIT: corretto errore nel codice
 

Teech

Member
Licensed User
Longtime User
Qui i dati di 'intent_' dopo la .SetComponent se può essere di aiuto.
upload_2015-9-4_12-51-11.png
 

cimperia

Active Member
Licensed User
Longtime User
Non ho mai provato con CallSubDelayed. Dovrò dare un'occhiata.
 

Teech

Member
Licensed User
Longtime User
Ho provato ad usare StartActivity e, come pensavo, il problema pare essere sul Manifest
android.content.ActivityNotFoundException: Unable to find explicit activity class {b4a.PerfectPurchase/b4a.PerfectPurchase.CategoryManager}; have you declared this activity in your AndroidManifest.xml?
 

cimperia

Active Member
Licensed User
Longtime User
If you want to post your project (zip format), I could have a look for you. (Mi dispiace, capisco italiano - mio padre era italiano - ma non lo scrivo bene)
 

cimperia

Active Member
Licensed User
Longtime User
Ho capito il problema. Si dove utilizzare lettere minuscole per il nome dell'attività.

Edit: Ma non sono sicuro se è possibile utilizzare CallSubDelayed

B4X:
  intent_.SetComponent(GetPackageName & "/.categorymanager")
 
Last edited:

Teech

Member
Licensed User
Longtime User
Confermo che con CallSubDelayed non funziona mentre con StartActivity funziona correttamente.
 

cimperia

Active Member
Licensed User
Longtime User
Questo dovrebbe funzionare, ma sembra che ci sia un bug con PutExtra. Quando si tenta di aggiungere la categoria, non lo fa, pertanto, il parametro è mancante.

Io segnalarlo Erel.

B4X:
Sub btAddCategory_Click
   Dim edit_category As Category

   edit_category.Initialize
   edit_category.Text = "Wine"
   edit_category.notes = "Original Notes"
   edit_category.IsNew = False


   intent_.Initialize("", "")
   intent_.PutExtra("FromActivity", "CategoriesManager")  
   intent_.PutExtra("cat", edit_category)
   intent_.PutExtra("Sub_To_Call", "InsertCategory")  

   Log(intent_.ExtrasToString)

   intent_.SetComponent(GetPackageName & "/.categorymanager")

   StartActivity(intent_)
End Sub

In CategoryManager Activity:
B4X:
Sub Activity_Resume
   Dim sub_name As String
   Dim aCategory As Category

   Dim StartingIntent As Intent
   StartingIntent = Activity.GetStartingIntent

   sub_name = StartingIntent.GetExtra("Sub_To_Call")
   Log(StartingIntent.HasExtra("cat")) 'Shows false
   aCategory = StartingIntent.GetExtra("cat")
   Log(aCategory = Null) 'Always true

   CallSub2("", sub_name, aCategory) 'aCategory is always null
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
In effetti, sembra che se un extra è un oggetto, anziché un semplice testo, la cosa non funzioni.

C'è comunque una soluzione semplice al problema iniziale, ovvero senza usare gli Intent.

Basterebbe mettere una routine apposita nelle Activity da richiamare:


Nella Activity da chiamare - nome: MyActivity
B4X:
Public Sub ForCalling(Caller As String)
    Log("Caller: " & Caller)
End Sub


Nella Activity chiamante, Main:
B4X:
CallSubDelayed2(MyActivity, "ForCalling", "Main")
 
Last edited:

cimperia

Active Member
Licensed User
Longtime User
Hai ragione, e in questo caso specifico, sarebbe:

B4X:
CallSubDelayed3 ("CategoryManager", "InsertCategory", edit_category, "Main")
 
Top