0

I am trying to create a stack of cards dynamically by using a RelativeLayout and setting the ALIGN_PARENT_BOTTOM rule and the bottomMargin. But the cards keep getting drawn over each other disregarding the margin. But they draw properly when I use ALIGN_PARENT_TOP and topMargin.

activity_single_player_game.xml (Code creating RelativeLayout)

<!-- other code -->

    <RelativeLayout
        android:id="@+id/frame_card_stack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="bottom" >

        <ImageView
            android:id="@+id/image_hand_value"
            android:layout_width="40dip"
            android:layout_height="20dip"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="20dip" />

        <TextView
            android:id="@+id/text_hand_value"
            android:layout_width="40dip"
            android:layout_height="20dip"
            android:gravity="center"
            android:layout_alignParentBottom="true"
            android:background="#88000000" />

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/frame_card_stack_split"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:gravity="bottom" >

        <ImageView
            android:id="@+id/image_hand_value_split"
            android:layout_width="40dip"
            android:layout_height="20dip"
            android:layout_alignParentBottom="true" />

        <TextView
            android:id="@+id/text_hand_value_split"
            android:layout_width="40dip"
            android:layout_height="20dip"
            android:gravity="center"
            android:layout_alignParentBottom="true"
            android:background="#88000000" />

    </RelativeLayout>

<!-- other code -->

SinglePlayerGameActivity.java (Code creating the stack of cards)

RelativeLayout playerView;
RelativeLayout playerViewSplit;

@Override
protected void OnCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_single_player_game);

    playerView = (RelativeLayout) findViewById(R.id.frame_card_stack);
    playerViewSplit = (RelativeLayout) findViewById(R.id.frame_card_stack_split);
}

public ImageView getCardImage(BJCard card, int offset, boolean playerCard) {
    ImageView cardImage = new ImageView(this);
    cardImage.setImageResource(BJUtility.drawableIdForCard(card));
    cardImage.setBackgroundColor(0x40000000);
    if (playerCard) {
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        params.bottomMargin = dip(20 * offset);
        cardImage.setLayoutParams(params);
    } else {
        LayoutParams params = new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT);
        cardImage.setLayoutParams(params);
    }
    return cardImage;
}

public void populatePlayer() {
    BJPlayerBox box = MenuActivity.bjmc.playerBoxes.get(MenuActivity.bjmc.activePlayerBox);
    BJCardDeck deck = box.cardDecks.get(box.activeDeckIndex);
    for (int i = 0; i < deck.cards.size(); i++) {
        BJCard card = deck.cards.get(i);
        playerView.addView(getCardImage(card, i, true), playerView.getChildCount() - 2);
    }
    updatePlayerSumView(deck, BEGIN, box.activeDeckIndex);
}

public void updatePlayer(int flag) {
    BJPlayerBox box = MenuActivity.bjmc.playerBoxes.get(MenuActivity.bjmc.activePlayerBox);
    switch (flag) {
    case HIT:
        BJCardDeck deck = box.cardDecks.get(box.activeDeckIndex);
        for (int i = playerView.getChildCount() - 2; i < deck.cards.size(); i++) {
            BJCard card = deck.cards.get(i);
            playerView.addView(getCardImage(card, i, true), playerView.getChildCount() - 2);
        }
        updatePlayerSumView(deck, flag, box.activeDeckIndex);
        break;
    case SPLIT:
        playerViewSplit.setVisibility(android.view.View.VISIBLE);
        ImageView splitCardView = (ImageView) playerView.getChildAt(playerView.getChildCount() - 2);
        playerView.removeView(splitCardView);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        params.bottomMargin = dip(0);
        playerViewSplit.addView(splitCardView, playerViewSplit.getChildCount() - 2);
        splitCardView.setLayoutParams(params);
        // update first deck
        BJCardDeck splitDeck = box.cardDecks.get(0);
        BJCard card = splitDeck.cards.get(1);
        playerView.addView(getCardImage(card, 1, true), playerView.getChildCount() - 2);
        updatePlayerSumView(splitDeck, SPLIT, 0);
        // update split deck
        splitDeck = box.cardDecks.get(1);
        card = splitDeck.cards.get(1);
        playerViewSplit.addView(getCardImage(card, 1, true), playerViewSplit.getChildCount() - 2);
        updatePlayerSumView(splitDeck, SPLIT, 1);
        break;
    case SURRENDER:
        updatePlayerSumView(box.activeCardDeck(), flag, box.activeDeckIndex);
    }
}

public void updatePlayerSumView(BJCardDeck deck, int flag, int splitIndex) {
    ImageView iv;
    TextView tv;
    if (splitIndex == 0) {
        iv = (ImageView) findViewById(R.id.image_hand_value);
        tv = (TextView) findViewById(R.id.text_hand_value); 
    } else {
        iv = (ImageView) findViewById(R.id.image_hand_value_split);
        tv = (TextView) findViewById(R.id.text_hand_value_split); 
    }
    if (flag == SURRENDER) {
        tv.setText(null);
        iv.setImageResource(R.drawable.flag);
        return;
    }
    if (flag != SPLIT && BJUtility.isBlackjack(deck)) {
        iv.setImageResource(R.drawable.crown);
    } else {
        int[] playerSum = BJUtility.currentCardHandTotal(deck.cards);
        if (playerSum[0] > 21) {
            tv.setText(null);
            iv.setImageResource(R.drawable.bust);
        } else {
            if (playerSum.length == 1) {
                tv.setText(Integer.toString(playerSum[0]));
                tv.setTextColor(getResources().getColor(R.color.orangish_yellow));
            } else {
                // TODO: if deckState = active, show both, else, show one
                tv.setText(playerSum[1] + "/" + playerSum[0]);
                tv.setTextColor(getResources().getColor(R.color.orangish_yellow));
            }
        }
    }
}

Here are some screenshots-

What I want

This is what I get when I use ALIGN_PARENT_TOP and topMargin. I want exactly this, except that the circled cards should be down with the text.

What I get

This is what I get when I use ALIGN_PARENT_BOTTOM and bottomMargin. Here the cards are in the correct position as a group, but they are all drawn completely over each other, so I can see only one.

CodePro_NotYet
  • 621
  • 6
  • 17

1 Answers1

0

What is your playerView??

If it is a RelativeLayout and the android:layout_height="wrap_content" then android:layout_marginBottom does not work.

Since setting android:paddingBottom="" to the playerView is not an option for you, you can try setting the android:layout_marginTop for the previous child views.

Something like, adding android:layout_marginTop to the 1st card, while adding the 2nd card.

Archie.bpgc
  • 23,812
  • 38
  • 150
  • 226
  • `playerView` is the `RelativeLayout` containing the cards. I have updated the code to show that. Why does `android:layout_marginBottom` not work, when `android:layout_marginTop` works? For the method you suggested, I will have to update each card of the existing stack every time I add a new card. Isn't there a better way? – CodePro_NotYet Jul 01 '14 at 06:56
  • [Here](http://stackoverflow.com/questions/8642071/why-marginbottom-not-working). A better solution would be, to wrap your `imageView` inside a `ViewGroup` 1st which has a bottom padding and then add that `ViewGroup` to your **playerView** – Archie.bpgc Jul 01 '14 at 07:10
  • Ok thanks. I did not really need `wrap_content` height so I changed it to `match_parent`. Working fine now. :) – CodePro_NotYet Jul 01 '14 at 07:29