1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Button in RelativeLayout Container mittig zentrieren (kein XML!)?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von flyMASTER, 05.08.2009.

  1. flyMASTER, 05.08.2009 #1
    flyMASTER

    flyMASTER Threadstarter Neuer Benutzer

    Beiträge:
    9
    Erhaltene Danke:
    0
    Registriert seit:
    04.08.2009
    Guten Abend euch allen,

    ich habe erst vir kurzem damit begonnen für Android zu programmieren und stolpere deshalb noch über das ein oder andere Verständnisproblem.


    Ich will meine GUI zum Teil nicht auf Basis der XML Files erstellen sondern zur Laufzeit generieren. Als Container habe ich mir ein „RelativeLayout“ ausgesucht, da ich damit im XML Layout Editor die besten Erfahrungen gesammelt habe.
    Zu diesem RelativeLayout Container wollte ich dann eine je nach Anwendungssituation unterschiedliche Anzahl an Buttons (an unterschiedlichen Stellen) im RelativeLayout Container/View positionieren, aber mir will das nicht so recht gelingen...
    Die XML Parameter android:layout_centerVertical und android:layout_centerHorizontal würde ich gerne setzen bzw. eine vergleichbare Funktion nutzen, aber ich finde einfach keine?!


    Ähnliche Probleme habe bei der Positionierung eines Objekts an einer bestimmten XY Koordinate, sowie das Benutzen der relativen Breite des Containers (in diesem Fall besitzt er die absolut mögliche Breite des Displays) um z.B. einen Button über das gesamte Display zu strecken.


    Sind diese Dinge überhaupt möglich und wenn ja, wie? Wo liegt mein Denkfehler? Wenn man im Internet sucht findet man immer nur Lösungen über den XML weg. Der ist für mich aber ausgeschlossen, da ich vor dem starten des Programms noch nicht weiß wann und wie viele z.B. Buttons wo auf dem Display zu positionieren sind.


    Ich freue mich über jede Hilfe :)
     
  2. miracle2k, 05.08.2009 #2
    miracle2k

    miracle2k Android-Hilfe.de Mitglied

    Beiträge:
    89
    Erhaltene Danke:
    15
    Registriert seit:
    03.07.2009
    Code:
    RelativeLayout. LayoutParams p = relativeLayoutView.generateDefaultLayoutParams();
    // oder komplett selbst: RelativeLayout. LayoutParams = new RelativeLayout.Params();
    
    p.width = RelativeLayout.LayoutParams.WRAP_CONTENT;
    p.gravity = ...
    childView.setLayoutParams(p);
    
    Jedes Layout hat eine eigene LayoutParams Klasse, und alle Kind-Views verwenden jeweils die entsprechende LayoutParams des Eltern-Views.
     
    Zuletzt bearbeitet: 05.08.2009
  3. flyMASTER, 05.08.2009 #3
    flyMASTER

    flyMASTER Threadstarter Neuer Benutzer

    Beiträge:
    9
    Erhaltene Danke:
    0
    Registriert seit:
    04.08.2009
    Vielen Dank für den Hinweis -> habe nun auch eine Lösung gefunden.

    Code:
    //"this" ist eine Klasse die von der Klasse RelativeLayout erbt
    
    this.startButton = new Button(this.getContext());
    this.startButton.setText("Text");
    
    RelativeLayout.LayoutParams tmpLp = (LayoutParams) this.generateDefaultLayoutParams();
     tmpLp.addRule(RelativeLayout.CENTER_IN_PARENT);
     tmpLp.width = RelativeLayout.LayoutParams.FILL_PARENT;
            
     this.startButton.setLayoutParams(tmpLp);
    
    Was mich etwas irritiert hat ist der Cast bei " (LayoutParams) this.generateDefaultLayoutParams();"... geht das auch eleganter?
     
  4. miracle2k, 05.08.2009 #4
    miracle2k

    miracle2k Android-Hilfe.de Mitglied

    Beiträge:
    89
    Erhaltene Danke:
    15
    Registriert seit:
    03.07.2009
    Seltsam - anscheinend ist der Rückgabewert von LinearLayout.generateDefaultLayoutParams() als ViewGroup.LayoutParams definiert.

    Komischerweise mache ich das selbe mit FrameLayout, wo es ohne Cast klappt - dort wird nämlich direkt auch ein FrameLayout.LayoutParams zurückgegeben. Vielleicht wurde da was übersehen.
     
  5. flyMASTER, 05.08.2009 #5
    flyMASTER

    flyMASTER Threadstarter Neuer Benutzer

    Beiträge:
    9
    Erhaltene Danke:
    0
    Registriert seit:
    04.08.2009
    Hmm naja, so funktionierts ja erstmal.

    Ich hänge aber schon am nächsten Problem:

    Ich will ein Array von Strings an einen ArrayAdapter übergeben und diesen ArrayAdapter an einen Spinner anbinden.


    PHP:
    this.memorySet = new Spinner(contentView.getContext());
                    
    String[] = {"A","A","A"};
            
    ArrayAdapter<Stringaa = new ArrayAdapter<String>(this.getContext(),this.memorySet.getId(),s);

    this.memorySet.setAdapter(aa);
    Leider stürzt der Emulator beim ausführe ab...

    Ich vermute das ich noch aa.setDropDownViewResource(resource) ausführen muss, aber ich habe keine id für die resource denn der Spinner und auch das String[] werden zur Laufzeit generiert und existieren in keinem XML File...

    Generell: Kann man passende XML Datensätze zur Laufzeit generieren? Irgendwie muss das doch auch ohne gehen, wie soll man sonst dynamische Inhalte programmiere deren GUI Elemente nicht vorraussagbar sind?
     
  6. flyMASTER, 05.08.2009 #6
    flyMASTER

    flyMASTER Threadstarter Neuer Benutzer

    Beiträge:
    9
    Erhaltene Danke:
    0
    Registriert seit:
    04.08.2009
    Okay, mein Posting war wohl etwas vorschnell. Habe eine Lösung gefunden auch wenn mich das Konzept immernoch etwas irritiert:

    PHP:
    ArrayAdapter<Stringaa = new ArrayAdapter<String>(this.getContext(),R.layout.simple_spinner_item,s);
            
    this.memorySetSpinner.setAdapter(aa);
     

Diese Seite empfehlen