Java [Android] Wie View aktualisieren/anpassen, wenn sich die Größe der ViewGroup ändert?

T

Tersus

Gast
[Android] Wie View Maße dynamisch an den Parent angleichen!?

EDIT: Ich habe die Problemstellung etwas verändert/vereinfacht, in der Hoffnung, dass besser verstanden wird, wo das Problem liegt.

Guten Tag,

ich möchte bei einer Größenveränderung meiner ViewGroup die in ihr enthaltenen Kinder an die neue Größe der ViewGroup anpassen!
Das ist aber schrecklich schwierig!

Ich habe in meiner ViewGroup (GridLayout) lediglich einen Button! Wird dieser Button geklickt, dann ändert sich die Größe der ViewGroup. Nun soll, auf die Größenveränderung meiner ViewGroup automatisch eine Größenveränderung meines Buttons erfolgen. Dies muss ich mit einem Listener realisieren.

Code:
Code:
public class HauptAktivitaet extends Activity implements OnLayoutChangeListener, OnClickListener{
  
  /** ViewGroup */
  
  private GridLayout mGridLayout;
  
  /** ViewGroup.LayoutParams */
  
  private GridLayout.LayoutParams mGridLayout_LayoutParams;
  
  /** Kind der ViewGroup */
  
  private Button mButton;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    inline();
    
    setContentView(mGridLayout);
    
  }
  
  private void inline(){
  
    /* Instanziierung der ViewGroup */

    mGridLayout = new GridLayout(this);
    
    /* Setzung der Anzahl von Reihen und Spalten
     * Eher unnuetz, da nur ein Kind enthalten
     */

    mGridLayout.setRowCount(1);
    mGridLayout.setColumnCount(1);
    
    /* Setzen des Listeners, um auf Layoutaenderungen der ViewGroup zu reagieren */
    
    mGridLayout.addOnLayoutChangeListener(this);
    
    /* Instanziierung des Layouts für den Button */
    
    mGridLayout_LayoutParams = new GridLayout.LayoutParams(GridLayout.spec(0), GridLayout.spec(0));
    
    /* Instanziierung des Buttons */
    
    mButton = new Button(this);
    mButton.setLayoutParams(mGridLayout_LayoutParams);
    mButton.setOnClickListener(this); // A click on this Button changes the Size of its parent ViewGroup.
    
    mGridLayout.addView(mButton);
    
  }
  
  private int AnzahlAufrufeLayoutChange = 0;
  @Override
  public void onLayoutChange(View v, int left, int top, int right, int bottom,
      int oldLeft, int oldTop, int oldRight, int oldBottom) {
    
    /* Neue Breite und Hoehe der ViewGroup sind an dieser Stelle bekannt! 
     * Die Werte stimmen, denn die ViewGroup wurde bereits gerendert.
     */
    
    int width = mGridLayout.getWidth();
    int height = mGridLayout.getHeight();
    
    /* Dynamische Groessenaenderungen des Buttons 
     * auf die Haelfte der Groesse der ViewGroup
     */
    
    mGridLayout_LayoutParams.width = (int) (width * 0.75);
    mGridLayout_LayoutParams.height =(int) (height * 0.75);
    
    /* FEHLER!:
     * Der Button wird, obwohl die Werte bekannt, nicht richtig gerendert! */
    
    mButton.requestLayout();
    
    /* Kleine Debug-Info */
    
    mButton.setText("Eigene Breite = " + mButton.getWidth() + "\n" + 
                         "Eigene Hoehe  = " + mButton.getHeight() + "\n" +
                         "Perent Breite = " + width + "\n" +
                         "Perent Hoehe  = " + height + "\n" +
                         "Anzahl Aufrufe = " + AnzahlAufrufeLayoutChange++);
    
    
  }

  private boolean switcher = true;

  /** 
   * Aendert bei jedem Klick die Groesse der ViewGroup.
   * Diese Methode funktioniert korrekt!
   * */

  @Override
  public void onClick(View v) {
    
    int width = 0;
    int height = 0;
    
    if(switcher){
      width = 600;
      height = 600;
      switcher = false;
    }else{
      width = 800;
      height = 800;
      switcher = true;
    }
       
    mGridLayout.getLayoutParams().width = width;
    mGridLayout.getLayoutParams().height = height;

    /* Wird korrekt aufgerufen! Die ViewGroup wird 
     * mit den festgestezten Werten gerendert */
    
    mGridLayout.requestLayout();
    
  }
  
}

Der erste Klick auf den Button verändert die Größe der ViewGroup auf 600*600 px! Der zweite Klick ändert die Größe der ViewGroup auf 800*800 px. Bei jedem Wechsel der Größe der ViewGroup, wird dessen OnLayoutChange aufgerufen und auf die Veränderung entsprechend reagiert.
Was passiert als Reaktion? Wir lesen die neue Größe der ViewGroup aus. Diese stimmt stets, wie wir der kleinen Debug-Info (Text auf dem Button) entnehmen können. Weiterhin wird die Größe des Buttons berechnet und gesetzt! Aber der Button passt sich einfach nicht an, trotz des Aufrufes von requestLayout.

Wenn die ViewGroup 600*600 px groß ist, müsste der Button 450*450 px groß werden.
Wenn die ViewGroup 800*800 px groß ist, müsste der Button 600*600 px groß werden.
Der Button soll jeweils so 3/4 so groß sein, wie die ViewGroup, der er angehört.

Es ist genau umgekehrt. Wieso?

PS:
Es geht nicht um die Sinnhaftigkeit dieser Anwendung.
Es ist nicht erwünscht, irgendeine View zu erweitern. Jede View soll nur von außen angefasst werden. Hat man eine ViewGroup, in der mehrere Views dynamisch an dessen Größe angepasst werden müssen, müsste man jede erweitern.
 
Zuletzt bearbeitet von einem Moderator: (Vereinfachung der Problemstellung)
Hallo,

kopier die beiden Zeilen:
Code:
        mGridLayout_LayoutParams.width = (int) (width * 0.75);
        mGridLayout_LayoutParams.height =(int) (height * 0.75);
hinter
Code:
mGridLayout.getLayoutParams().height = height;
in onClick.

BTW: Benutze Log.d("onLayoutChange", "Mein Output"); für Debugausgaben. ;)
 
Nein, das ist gänzlich falsch. :p

Nach dem ich mich näher mit der Thematik, wie Android eine View(Group) zeichnet, beschäftigt habe, ist es auf dem Weg, wie ich es will, elegant leider nicht zu lösen. Es gibt eine unelegante Möglichkeit mittels eines OnGlobalLayoutListeners und einer If/Else Verzweigung.

Sinnvoller ist es aber, eine eigene ViewGroup zu schreiben.
 

Ähnliche Themen

T
Antworten
2
Aufrufe
1.049
T
T
Antworten
0
Aufrufe
2.322
T
Zurück
Oben