German Button verlinkung?

conman

Member
Hallo,

ich bin absolut neu bei B4A und muss sagen es gefällt mir sehr!

Nun such ich aber schon seit uungefähr 5 Stunden nach einer möglichkeit einen Button den ich angelegt habe so zu verlinken das wenn ich drauf drück sich ein neues layer öffnet das ich gemacht habe.
Ich habe nichts gefunden im Netz dazuLiegt vllt. an der Uhrzeit?!

Also Beispiel:

auf dem main liegen 2 Buttons "about" und "produkts"
beides Buttons die eben Bilder sind.
Nun soll wenn ich auf About drücke sich das neue Layer namens "about" öffnen und wiedergeben was ich dafür vorgesehen habe.

wie muss ich hierfür den Code einsetzen?

Tut mir echt leid für die wahrscheinlich sehr doofe Frage
 

rbsoft

Active Member
Licensed User
Longtime User
Was meinst Du mit Layer - ein Panel oder eine Activity (Form)?

Rolf
 

conman

Member
Also auf Anhieb würde ich sagen eine neue activity will ich damit ansteuern.

@ Klaus - da habe ich geschaut aber irgendwie nicht das richtige gefunden. Ich hab es mir mal ausgedruckt
 

rbsoft

Active Member
Licensed User
Longtime User
Yep, der Link ist noch ausführlicher!

Rolf
 

conman

Member
So ich hab jetzt viel probiert und hab es echt hinbekommen. Dazu muss ich echt sagen das die Hilfe hier in diesem Forum echt aussergewöhnlich gut ist!

Ich trau mich fast garnicht zu fragen, aber ich hab rumgesucht um einen Codeschnippel zu finden das ich die "Back-Taste" bedienen kann, damit das App nicht komplett ausgeht, sondern nur eins zurück.

Sub Activity_KeyPress (KeyCode As Int) As Boolean
If Keycode = KeyCodes.KEYCODE_BACK Then
Return True
Else
Return False
End If
End Sub

Ich hab dies hier versucht, aber leider ohne den Erfolg den wollte, das App geht immernoch komplett close.

Also wenn ich ganz lieb frag hilft mir jemand?
 

rbsoft

Active Member
Licensed User
Longtime User
Dein Code ist eigentlich korrekt und funktioniert so auch bei mir. Schau mal, ob Du ihn auch in der richtigen Activity hast (wenn Du mit mehr als einer arbeitest).

Rolf
 

conman

Member
Nun, ich habe es jetzt an sogut wie jeder Stelle probiert. Das Programm geht mittlerweile auch nicht mehr aus, erster Erfolg. Nur bin ich eben ratlos wo genau ich schlussendlich diesen Code einfügen sollte.

Vereinfacht der Quellcode
 

klaus

Expert
Licensed User
Longtime User
Füge folgenden Code ein:
B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean 'Return True to consume the event
    Dim Antw As Int
    If KeyCode = KeyCodes.KEYCODE_BACK Then
        Antw = Msgbox2("Wollen Sie wirklich das Programm verlassen ?", "ACHTUNG", "Ja", "", "Nein", Null)
        If Antw = DialogResponse.POSITIVE Then
            Return False
        Else
            Return True
        End If
    Else 
        Return False
    End If
End Sub
Mit dem Code aus Post #8 wird das Programm nie mit dem Back Button verlassen.

Beste Grüsse.
 

conman

Member
Hallo klaus,

dein Codeschnippel an sich ist wunderbar werde ich mir auf jeden Fall abspeichern für spätere Projekte, aber ich wollte kein Zurück zum Homescreen sondern ein zurück auf die Vorseite.

Einen schönen Vorabend noch
 

klaus

Expert
Licensed User
Longtime User
Ich würde Dir vorschlagen nicht die Lösung mit einer Activity und mehren Layouts zu benutzen.
Die beste Lösung ist mit mehreren Activities zu arbeiten, so ist Android auch ausgelegt.
In diesem Fall wenn Du in der zweiten Activity bist und den Back Button drückst geht das Programm zur vorhergehenden Activity zurück. Und die Frage ob man das Programm verlassen will wird nicht angezeigt, sie wird nur angezeigt wenn man in der Main Activity ist.
Die Handlung, wenn man das Gerät dreht, ist auch viel einfacher. Man braucht sich nicht zu kümmern in welcher Activity sich man sich befindet, die aktuelle wird erneuert.

Das Codebeispiel zur Frage vor dem Schliessen eines Programmes befindet sich im Beginner's Guide Kapitel 21.6 .

Beste Grüsse.
 

conman

Member
Also ich hab mich jetzt umgeschaut und den Guide durchgelesen nach der methode, welche Du mir vorgeschlagen hast. Die Tutorials habe ich auch hier schon gesehen und im Guide steht was von der Benutzung der module.
Das Problem welches ich habe ist das ich die Testversion am beutzen bin da ich erst seit gestern mit Basic4Android am arbeiten bin. :sign0013:
Wenn es einer wünscht und sich meinen "Salat" einmal komplett anschauen möchte so wie er jetzt ist und mir dann evtl. sagen kann das ich dafür garnicht die module brauch


mfg
 

Kiffi

Well-Known Member
Licensed User
Longtime User
@conman:

Wie Klaus schon erwähnte: Für Produkte, Angebote, Gutscheine
und 'About' solltest Du je eine Activity erstellen.

Menüzeile: Project -> Add new Module -> Activity Module

Bei Klick auf den jeweiligen Button in Deiner Main-Activity kannst
Du dann die entsprechende Activity starten:

B4X:
Sub btnabout_Click
  StartActivity(about)
End Sub
 
Sub btnprodukte_Click
  StartActivity(produkte)
End Sub

[...]

Und in der jeweiligen Activity lädst Du dann das entsprechende Layout:

B4X:
Sub Activity_Create(FirstTime As Boolean)
  Activity.LoadLayout("about")
  [...]
End Sub

Grüße ... Kiffi
 

conman

Member
und genau dort liegt ja mein Problem, ich habe ja nur die Testversion um das Programm zu testen, das Programm ist wirklich gut. Nur wollte ich komplett testen wie mächtig das Programm ist, man will ja nicht die katze im Sack kaufen.

Und in der Testversion kann ich ja keine module erstellen, leider
 

Kiffi

Well-Known Member
Licensed User
Longtime User
Und in der Testversion kann ich ja keine module erstellen, leider
ach so! Jetzt verstehe ich.

Hier mal eine Lösung mit Panels, die Du nach Bedarf sichtbar schaltest. Da der
Designer Panels zwar anzeigen kann, diese allerdings nicht wirklich Container-
Funktionalitäten besitzen, musst Du Deine Controls im Code erstellen:

B4X:
'Activity module
Sub Process_Globals
   'These global variables will be declared once when the application starts.
   'These variables can be accessed from all modules.

End Sub

Sub Globals
   'These global variables will be redeclared each time the activity is created.
   'These variables can only be accessed from this module.

   Dim CurrentView As String

   ' Main
   Dim pnlMain As Panel
   Dim lblMainHeader As Label
   Dim cmdMainProducts As Button
   Dim cmdMainAbout As Button
   
   ' Products
   Dim pnlProducts As Panel
   Dim lblProductsHeader As Label

   ' About
   Dim pnlAbout As Panel
   Dim lblAboutHeader As Label

End Sub

Sub Activity_Create(FirstTime As Boolean)

   ' Main
   
   pnlMain.Initialize("pnlMain")
   
   lblMainHeader.Initialize("lblMainHeader")
   lblMainHeader.Text="Main"
   
   cmdMainProducts.Initialize("cmdMainProducts")
   cmdMainProducts.Text="Produkte"
   
   cmdMainAbout.Initialize("cmdMainAbout")
   cmdMainAbout.Text="About"
   
   Activity.AddView(pnlMain, 0, 0, 100%X, 100%Y)
   pnlMain.AddView(lblMainHeader, 10dip, 10dip, 200dip, 40dip)
   pnlMain.AddView(cmdMainProducts, 10dip, 60dip, 200dip, 100dip)
   pnlMain.AddView(cmdMainAbout, 10dip, 170dip, 200dip, 100dip)
   
   ' Produkte
   
   pnlProducts.Initialize("pnlProducts")
   
   lblProductsHeader.Initialize("lblProductsHeader")
   lblProductsHeader.Text="Produkte"

   Activity.AddView(pnlProducts, 0, 0, 100%X, 100%Y)
   pnlProducts.AddView(lblProductsHeader, 10dip, 10dip, 200dip, 40dip)
   
   ' About
   
   pnlAbout.Initialize("pnlAbout")
   
   lblAboutHeader.Initialize("lblAboutHeader")
   lblAboutHeader.Text="About"

   Activity.AddView(pnlAbout, 0, 0, 100%X, 100%Y)
   pnlAbout.AddView(lblAboutHeader, 10dip, 10dip, 200dip, 40dip)

   SetView("main")
   
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub cmdMainProducts_Click

   SetView("products")
   
End Sub

Sub cmdMainAbout_Click
   
   SetView("about")
   
End Sub

 Sub Activity_KeyPress (KeyCode As Int) As Boolean 'Return True to consume the event
 
  If KeyCode = KeyCodes.KEYCODE_BACK Then
   
      Select Case CurrentView
      
         Case "main"
            Return Msgbox2("Wollen Sie wirklich das Programm verlassen?", "ACHTUNG", "Ja", "", "Nein", Null) = DialogResponse.NEGATIVE

         Case "products"
            SetView("main")
            Return True

         Case "about"
            SetView("main")
            Return True

      End Select
         
  Else 
   
     Return False
      
  End If
   
End Sub

Sub SetView(viewname As String)

   pnlMain.Visible = False
   pnlProducts.Visible = False
   pnlAbout.Visible = False

   Select Case viewname
   
      Case "main"
         pnlMain.Visible = True
         
      Case "products"
         pnlProducts.Visible = True
         
      Case "about"
         pnlAbout.Visible = True
         
   End Select   

   CurrentView = viewname

End Sub

Letztendlich ist obiger Code nicht das Gelbe vom Ei. Ab einer gewissen Größe
wir der Code recht schlacht wartbar sein. Einfacher und übersichtlicher geht
es mit Activities.

Grüße ... Kiffi
 

klaus

Expert
Licensed User
Longtime User
Hallo Kiffi,
Designer Panels zwar anzeigen kann, diese allerdings nicht wirklich Container-
Funktionalitäten besitzen, musst Du Deine Controls im Code erstellen:
Man kann für jedes Panel eine Layoutdatei erstellen und diese, zum Beispiel, mit pnlProdukte.LoadLayout("produkte") lesen.

Als Beispiel: versuch2.zip in Post #17.

Beste Grüsse.
 

Kiffi

Well-Known Member
Licensed User
Longtime User
Hallo Klaus,

Man kann für jedes Panel eine Layoutdatei erstellen und diese, zum Beispiel, mit pnlProdukte.LoadLayout("produkte") lesen.
Danke für den Tipp!

Grüße ... Kiffi
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…