Android: Größe der benutzerdefinierten Ansichten. Parent wird verändert, aber die Breite/Höhe ändert nicht überliefert Kind anzeigen

Ich bin derzeit versuchen, ein Spiel auf der Grundlage der alten Schule battleship board game mit android. Ich bin irgendwie einfach nur Herumspielen im moment zu versuchen, um ein Gefühl für Sie und für die Komponenten, die ich möglicherweise brauchen, um das Spiel zu machen.

Im Grunde, was ich in dem moment in meine layout-xml-Datei ist der folgende:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<org.greene.battleship.BoardView
    android:id="@+id/board_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true" />
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <org.greene.battleship.ShipView
            android:id="@+id/ships_view"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:clickable="true" />
    </RelativeLayout>
</RelativeLayout>

Möchte ich die BoardView nehmen nur einen bestimmten Teil des Bildschirms, D. H. der Ansicht sein sollte die Größe der Inhalte, die ich erstellen möchten, die in dieser Ansicht. In diesem Fall ist ein 2D-Brett. Dies geschieht durch überschreiben der onMeasure () - Methode aus der Verlängerung Anzeigen. Der view Breite ist immer die gleiche, aber die Höhe den gleichen Wert wie die Breite geben ein perfektes Quadrat.

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){

    int parent_width = MeasureSpec.getSize(widthMeasureSpec);
    this.setMeasuredDimension(parent_width, parent_width);
    Log.d("BOARD_VIEW", "BoardView.onMeasure : width = " + this.getMeasuredWidth() + ", height = " 
            + this.getMeasuredHeight());
}

Ich überprüfen, um zu sehen, wenn der Blick auf die Dimensionen geändert haben, durch überschreiben der Ansichten onSizeChanged () - Funktion und der überprüfung der Werte gibt.

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh){
    Log.d("BOARD_VIEW", "BoardView.onSizeChanged : width = " + w + ", height = " + h);
    board = new Board(w, h, game_activity);
    super.onSizeChanged(w, h, oldw, oldh);

}

Wie gesehen werden kann, von der layout-Datei, dann habe ich ein RelativeLayout Gruppe Ansicht, dass hält noch eine benutzerdefinierte Ansicht genannt ShipView wie ein Kind. Und im Idealfall, was ich will, geschehen wird, wenn ich gehe, um zu Messen, seine Dimensionen, seine Dimensionen wurden beschränkt sich auf das, was in onMeasure. Ich check die Abmessungen des ShipView über seine onMeasure () - Methode auf ähnliche Weise.

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){

    int parent_width = MeasureSpec.getSize(widthMeasureSpec);
    int parent_height = MeasureSpec.getSize(heightMeasureSpec);

    Log.d("SHIP_VIEW", "ShipView.onMeasure : width = " + parent_width + ", height = " + parent_height);

    this.setMeasuredDimension(parent_width, parent_height);

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Den log-Dateien zeigen Sie mir die folgende (der onMeasure () - Methode scheint mehr als einmal aufgerufen, aber die Werte sind alles das gleiche, damit ich nicht die Mühe zu zeigen, die mehrere Protokolle als Werte sind alle die selben) :

05-04 16:36:19.428: DEBUG/BOARD_VIEW(405): BoardView.onMeasure : width = 320, height = 320
05-04 16:36:19.939: DEBUG/BOARD_VIEW(405): BoardView.onSizeChanged : width = 320, height = 320
05-04 16:36:20.429: DEBUG/SHIP_VIEW(405): ShipView.onMeasure : width = 320, height = 430

Scheint es, dass, wenn ich die Dimensionen der ShipViews onMeasure() hat sich nichts geändert und ignoriert die dimension Einschränkungen habe ich gesetzt. Ich bin mir nicht sicher, ob es hat etwas zu tun mit dem RelativeLayout der ShipView. Muss ich für die LayoutParams, da Sie sich geändert haben? Ich dachte, dass, wenn Sie ändern den Blick auf die dimension des übergeordneten hätte es schon weitergegeben an die Kinder.

Ob dies der richtige Weg zu gehen über das tun dies für ein Spiel dieser Art ist auf jeden Fall für Diskussion, aber so oder so ich würde gerne wissen, wie es getan werden kann (ich vermute, es kann..?). Jede Hilfe wäre sehr geschätzt werden.

  • Nicht verlassen der layout_height-Attributen aus der Ihre benutzerdefinierte Steuerelemente in der xml (gegeben Sie sind Sie jedenfalls nicht) einen Unterschied machen?
  • Ich habe gesehen, Menschen tun, die auf meinen Reisen durch die Foren, so werde ich prüfen, dass aus und erhalten Sie zurück. Ich habe das Gefühl aber, dass es hat etwas zu tun mit dem überschreiben der onLayout () - Funktion, wie ich gesehen Erwähnung von ihm als gut.
  • Sorry für die Verspätung! NÖ, Tat es nicht! Allerdings habe ich die gewünschten Abmessungen wird weitergegeben an das Kind, am Ende aber dies führte zu das Kind nicht hineingezogen wird, für einige Grund. Vielleicht ist mein Ansatz falsch ist, was ich versuche zu tun. So werde ich einen Schritt zurück, Lesen Sie mehr Dokumentation und vielleicht kommen, um eine bessere Lösung für das problem. Wenn ich die Lösung finden zu dem, was ich versuche zu tun, ich poste es wieder hier, da vielleicht jemand ein ähnliches problem an einem Tag!
  • Ich würde sicherlich gerne wissen, wie wenn Sie herausfinden!
InformationsquelleAutor cgreene | 2011-05-04
Schreibe einen Kommentar